{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"collapsed": true,
"school_cell_uuid": "5f4daf7d16ce46969053a7d95bed3d2e"
},
"source": [
"## 2.2 벡터와 행렬의 연산"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "dfcec2b1bfba4b769d7bcf316d0d9949"
},
"source": [
"벡터와 행렬도 숫자처럼 덧셈, 뺄셈, 곱셈 등의 연산을 할 수 있다. 벡터와 행렬의 연산을 이용하면 대량의 데이터에 대한 계산을 간단한 수식으로 나타낼 수 있다. 물론 벡터와 행렬에 대한 연산은 숫자의 사칙 연산과는 몇 가지 다른 점이 있으므로 이러한 차이를 잘 알아야 한다."
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "ffa30038bd3a40a4aa3a5e2fff641ac4"
},
"source": [
"이 절에서는 NumPy를 이용하여 벡터와 행렬의 연산을 실행하는 법도 공부한다. 다음처럼 NumPy와 matplotlib 패키지가 임포트되어 있어야 한다. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"school_cell_uuid": "0f88d98fe6be4a3fadd74a6f24563a7b"
},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pylab as plt"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "cb94846e5abe46fd92f6ff3c7a7b9a25"
},
"source": [
"### 벡터/행렬의 덧셈과 뺄셈"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "080cd979ae564a93a3c095855b315d25"
},
"source": [
"같은 크기를 가진 두 개의 벡터나 행렬은 덧셈과 뺄셈을 할 수 있다. 두 벡터와 행렬에서 같은 위치에 있는 원소끼리 덧셈과 뺄셈을 하면 된다. 이러한 연산을 **요소별(element-wise) 연산**이라고 한다. "
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "68780cec81124d158b3e8d074bbf0785"
},
"source": [
"예를 들어 벡터 $x$와 $y$가 다음과 같으면,\n",
"\n",
"$$\n",
"x=\n",
"\\begin{bmatrix}\n",
"10 \\\\\n",
"11 \\\\\n",
"12 \\\\\n",
"\\end{bmatrix}\n",
",\\;\\;\n",
"y=\n",
"\\begin{bmatrix}\n",
"0 \\\\\n",
"1 \\\\\n",
"2 \\\\\n",
"\\end{bmatrix}\n",
"$$\n",
"\n",
"벡터 $x$와 $y$의 덧셈 $x+y$와 뺄셈 $x-y$는 다음처럼 계산한다.\n",
"\n",
"$$\n",
"x + y =\n",
"\\begin{bmatrix}\n",
"10 \\\\\n",
"11 \\\\\n",
"12 \\\\\n",
"\\end{bmatrix}\n",
"+\n",
"\\begin{bmatrix}\n",
"0 \\\\\n",
"1 \\\\\n",
"2 \\\\\n",
"\\end{bmatrix}\n",
"=\n",
"\\begin{bmatrix}\n",
"10 + 0 \\\\\n",
"11 + 1 \\\\\n",
"12 + 2 \\\\\n",
"\\end{bmatrix}\n",
"=\n",
"\\begin{bmatrix}\n",
"10 \\\\\n",
"12 \\\\\n",
"14 \\\\\n",
"\\end{bmatrix}\n",
"$$\n",
"\n",
"$$\n",
"x - y =\n",
"\\begin{bmatrix}\n",
"10 \\\\\n",
"11 \\\\\n",
"12 \\\\\n",
"\\end{bmatrix}\n",
"-\n",
"\\begin{bmatrix}\n",
"0 \\\\\n",
"1 \\\\\n",
"2 \\\\\n",
"\\end{bmatrix}\n",
"=\n",
"\\begin{bmatrix}\n",
"10 - 0 \\\\\n",
"11 - 1 \\\\\n",
"12 - 2 \\\\\n",
"\\end{bmatrix}\n",
"=\n",
"\\begin{bmatrix}\n",
"10 \\\\\n",
"10 \\\\\n",
"10 \\\\\n",
"\\end{bmatrix}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "1615caac7bce4f7194eb23696ca9c9f1"
},
"source": [
"벡터의 덧셈과 뺄셈을 NumPy로 계산하면 다음과 같다. 여기에서는 편의상 1차원 배열로 벡터를 표시하였다."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"school_cell_uuid": "92a4f1bd51064d95b35f88d28de98185"
},
"outputs": [],
"source": [
"x = np.array([10, 11, 12, 13, 14])\n",
"y = np.array([0, 1, 2, 3, 4])"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"school_cell_uuid": "a6e0e116c37142eabae65a0a118616eb"
},
"outputs": [
{
"data": {
"text/plain": [
"array([10, 12, 14, 16, 18])"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x + y"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"school_cell_uuid": "4ce5a014512f4b3192455936c19eb65f"
},
"outputs": [
{
"data": {
"text/plain": [
"array([10, 10, 10, 10, 10])"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x - y"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "e4ce357b185b48479f6a9fdb33a223ea"
},
"source": [
"행렬도 같은 방법으로 덧셈과 뺄셈을 할 수 있다.\n",
"\n",
"$$\n",
"\\begin{bmatrix}\n",
"5 & 6 \\\\\n",
"7 & 8\n",
"\\end{bmatrix}\n",
"+\n",
"\\begin{bmatrix}\n",
"10 & 20 \\\\\n",
"30 & 40 \\\\\n",
"\\end{bmatrix}\n",
"-\n",
"\\begin{bmatrix}\n",
"1 & 2 \\\\\n",
"3 & 4\n",
"\\end{bmatrix}\n",
"=\n",
"\\begin{bmatrix}\n",
"14 & 24 \\\\\n",
"34 & 44\n",
"\\end{bmatrix}\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"school_cell_uuid": "7dcf23494eac453e88f5f9528be19244"
},
"outputs": [
{
"data": {
"text/plain": [
"array([[14, 24],\n",
" [34, 44]])"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.array([[5, 6], [7, 8]]) + np.array([[10, 20], [30, 40]]) - \\\n",
" np.array([[1, 2], [3, 4]])"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "f0d566a306f6486c84dc5c75b50a505b"
},
"source": [
"### 스칼라와 벡터/행렬의 곱셈"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "7ab15da44c4b428f81ce32c3750fc858"
},
"source": [
"벡터 $x$ 또는 행렬 $A$에 스칼라 값 $c$를 곱하는 것은 **벡터 $x$ 또는 행렬 $A$의 모든 원소에 스칼라 값 $c$를 곱하는 것**과 같다.\n",
"\n",
"$$\n",
"\\begin{align}\n",
"c\n",
"\\begin{bmatrix}\n",
"x_1 \\\\\n",
"x_2\n",
"\\end{bmatrix}\n",
"=\n",
"\\begin{bmatrix}\n",
"cx_1 \\\\\n",
"cx_2\n",
"\\end{bmatrix}\n",
"\\tag{2.2.1}\n",
"\\end{align}\n",
"$$\n",
"\n",
"\n",
"$$\n",
"\\begin{align}\n",
"c\n",
"\\begin{bmatrix}\n",
"a_{11} & a_{12} \\\\\n",
"a_{21} & a_{22}\n",
"\\end{bmatrix}\n",
"=\n",
"\\begin{bmatrix}\n",
"ca_{11} & ca_{12} \\\\\n",
"ca_{21} & ca_{22}\n",
"\\end{bmatrix}\n",
"\\tag{2.2.2}\n",
"\\end{align}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "cd72e64ecffe44e2822425e8966d75f3"
},
"source": [
"### 브로드캐스팅"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "38cea09d8db74a0091f100327cfd486e"
},
"source": [
"원래 덧셈과 뺄셈은 크기(차원)가 같은 두 벡터에 대해서만 할 수 있다. 하지만 벡터와 스칼라의 경우에는 관례적으로 다음처럼 1-벡터를 사용하여 스칼라를 벡터로 변환한 연산을 허용한다. 이를 **브로드캐스팅(broadcasting)**이라고 한다.\n",
"\n",
"$$\n",
"\\begin{bmatrix}\n",
"10 \\\\\n",
"11 \\\\\n",
"12 \\\\\n",
"\\end{bmatrix}\n",
"- 10\n",
"=\n",
"\\begin{bmatrix}\n",
"10 \\\\\n",
"11 \\\\\n",
"12 \\\\\n",
"\\end{bmatrix}\n",
"- 10\\cdot \\mathbf{1}\n",
"=\n",
"\\begin{bmatrix}\n",
"10 \\\\\n",
"11 \\\\\n",
"12 \\\\\n",
"\\end{bmatrix}\n",
"-\n",
"\\begin{bmatrix}\n",
"10 \\\\\n",
"10 \\\\\n",
"10 \\\\\n",
"\\end{bmatrix}\n",
"$$\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "f4f3364e2cf748b29051e8dbd91da376"
},
"source": [
"데이터 분석에서는 원래의 데이터 벡터 $x$가 아니라 그 데이터 벡터의 각 원소의 평균값을 뺀 **평균제거(mean removed) 벡터** 혹은 **0-평균(zero-mean) 벡터**를 사용하는 경우가 많다.\n",
"\n",
"$$\n",
"\\begin{align}\n",
"x = \n",
"\\begin{bmatrix}\n",
"x_1 \\\\\n",
"x_2 \\\\\n",
"\\vdots \\\\\n",
"x_N\n",
"\\end{bmatrix}\n",
"\\;\\; \\rightarrow \\;\\;\n",
"x - m =\n",
"\\begin{bmatrix}\n",
"x_1 - m\\\\\n",
"x_2 - m \\\\\n",
"\\vdots \\\\\n",
"x_N - m\n",
"\\end{bmatrix}\n",
"\\tag{2.2.3}\n",
"\\end{align}\n",
"$$\n",
"\n",
"위 식에서 $m$은 샘플 평균이다.\n",
"\n",
"$$\n",
"\\begin{align}\n",
"m = \\dfrac{1}{N}\\sum_{i=1}^N x_i\n",
"\\tag{2.2.4}\n",
"\\end{align}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "d85ee8dd59084a09aefdb0fe82cbaa54"
},
"source": [
"### 선형조합"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "52f7e08ae2574162b1d2d773b3378df3"
},
"source": [
"벡터/행렬에 다음처럼 스칼라 값을 곱한 후 더하거나 뺀 것을 벡터/행렬의 **선형조합(linear combination)**이라고 한다. 벡터나 행렬을 선형조합해도 크기는 변하지 않는다.\n",
"\n",
"$$\n",
"\\begin{align}\n",
"c_1x_1 + c_2x_2 + c_3x_3 + \\cdots + c_Lx_L = x\n",
"\\tag{2.2.5}\n",
"\\end{align}\n",
"$$\n",
"\n",
"$$\n",
"\\begin{align}\n",
"c_1A_1 + c_2A_2 + c_3A_3 + \\cdots + c_LA_L = A\n",
"\\tag{2.2.6}\n",
"\\end{align}\n",
"$$\n",
"\n",
"\n",
"$$ c_1, c_2, \\ldots, c_L \\in \\mathbf{R} $$\n",
"\n",
"$$ x_1, x_2, \\ldots, x_L, x \\in \\mathbf{R}^M $$\n",
"\n",
"$$ A_1, A_2, \\ldots, A_L, A \\in \\mathbf{R}^{M \\times N} $$\n",
"\n",
"벡터나 행렬의 크기를 직사각형으로 표시하면 다음과 같다.\n",
"\n",
"$$\n",
"\\begin{align*}\n",
"\\begin{matrix}\n",
"c_1\\,\\boxed{\\begin{matrix} \\phantom{\\LARGE\\mathstrut} \\\\ x_1 \\\\ \\phantom{\\LARGE\\mathstrut} \\end{matrix}} & + &\n",
"c_2\\,\\boxed{\\begin{matrix} \\phantom{\\LARGE\\mathstrut} \\\\ x_2 \\\\ \\phantom{\\LARGE\\mathstrut} \\end{matrix}} & + & \n",
"\\cdots \\!\\!\\!\\!& + & \n",
"c_L\\,\\boxed{\\begin{matrix} \\phantom{\\LARGE\\mathstrut} \\\\ c_L \\\\ \\phantom{\\LARGE\\mathstrut} \\end{matrix}}\n",
"\\end{matrix}\n",
"\\tag{2.2.5}\n",
"\\end{align*}\n",
"$$\n",
"\n",
"$$\n",
"\\begin{align*}\n",
"\\begin{matrix}\n",
"c_1\\,\\boxed{\\begin{matrix} \\phantom{} & \\phantom{} & \\phantom{} \\\\ & A_1 & \\\\ \\phantom{} & \\phantom{} & \\phantom{} \\end{matrix}} \n",
"& + &\n",
"c_2\\,\\boxed{\\begin{matrix} \\phantom{} & \\phantom{} & \\phantom{} \\\\ & A_2 & \\\\ \\phantom{} & \\phantom{} & \\phantom{} \\end{matrix}} \n",
"& + &\n",
"\\cdots\n",
"& + &\n",
"c_L\\,\\boxed{\\begin{matrix} \\phantom{} & \\phantom{} & \\phantom{} \\\\ & A_L & \\\\ \\phantom{} & \\phantom{} & \\phantom{} \\end{matrix}} \n",
"\\end{matrix}\n",
"\\tag{2.2.6}\n",
"\\end{align*}\n",
"$$\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "e0a59b5e8b814543ad79c6a660b4bb6a"
},
"source": [
"### 벡터와 벡터의 곱셈"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "f09ed6d691264628b902c4e609a30d1d"
},
"source": [
"행렬의 곱셈을 정의하기 전에 우선 두 벡터의 곱셈을 알아보자. 벡터를 곱셈하는 방법은 여러 가지가 있지만 여기서는 **내적(inner product)**에 대해서만 다룬다. 벡터 $x$와 벡터 $y$의 내적은 다음처럼 표기한다.\n",
"\n",
"$$ \n",
"\\begin{align}\n",
"x^T y \n",
"\\tag{2.2.7}\n",
"\\end{align}\n",
"$$\n",
"\n",
"내적은 다음처럼 점(dot)으로 표기하는 경우도 있어서 **닷 프로덕트(dot product)**라고도 부르고 < $x,y$ > 기호로 나타낼 수도 있다.\n",
"\n",
"$$ \n",
"\\begin{align}\n",
"x \\cdot y = \\, < x, y > \\, = x^T y \n",
"\\tag{2.2.8}\n",
"\\end{align}\n",
"$$\n",
"\n",
"\n",
"\n",
"두 벡터를 내적하려면 다음과 같은 조건이 만족되어야 한다.\n",
"\n",
"1. 우선 두 벡터의 차원(길이)이 같아야 한다. \n",
"2. 앞의 벡터가 행 벡터이고 뒤의 벡터가 열 벡터여야 한다. \n",
"\n",
"이때 내적의 결과는 스칼라값이 되며 다음처럼 계산한다. 우선 같은 위치에 있는 원소들을 요소별 곱셈처럼 곱한 다음, 그 값들을 다시 모두 더해서 하나의 스칼라값으로 만든다.\n",
"\n",
"$$\n",
"\\begin{align}\n",
"x^T y = \n",
"\\begin{bmatrix}\n",
"x_{1} & x_{2} & \\cdots & x_{N} \n",
"\\end{bmatrix}\n",
"\\begin{bmatrix}\n",
"y_{1} \\\\\n",
"y_{2} \\\\\n",
"\\vdots \\\\\n",
"y_{N} \\\\\n",
"\\end{bmatrix} \n",
"= x_1 y_1 + \\cdots + x_N y_N \n",
"= \\sum_{i=1}^N x_i y_i\n",
"\\tag{2.2.9}\n",
"\\end{align}\n",
"$$\n",
"\n",
"$$ \n",
"x \\in \\mathbf{R}^{N \\times 1}\n",
"$$\n",
"\n",
"$$\n",
"y \\in \\mathbf{R}^{N \\times 1} \n",
"$$\n",
"\n",
"$$\n",
"x^T y \\in \\mathbf{R} \n",
"$$\n",
"\n",
"다음은 두 벡터의 곱셈의 예이다.\n",
"\n",
"$$\n",
"x =\n",
"\\begin{bmatrix}\n",
"1 \\\\ 2 \\\\ 3 \\\\\n",
"\\end{bmatrix}\n",
",\\;\\;\\;\n",
"y = \n",
"\\begin{bmatrix}\n",
"4 \\\\ 5 \\\\ 6 \\\\\n",
"\\end{bmatrix} \n",
"$$\n",
"\n",
"$$\n",
"x^T y = \n",
"\\begin{bmatrix}\n",
"1 & 2 & 3\n",
"\\end{bmatrix}\n",
"\\begin{bmatrix}\n",
"4 \\\\ 5 \\\\ 6 \\\\\n",
"\\end{bmatrix} \n",
"= 1 \\cdot 4 + 2 \\cdot 5 + 3 \\cdot 6 = 32\n",
"$$\n",
"\n",
"NumPy에서 벡터와 행렬의 곱은 `dot`이라는 명령 또는 `@`(at이라고 읽는다)이라는 연산자로 계산한다. 2차원 배열로 표시한 벡터를 내적했을 때는 결과값이 스칼라가 아닌 2차원 배열이다."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"school_cell_uuid": "439ddddaf6c64f73ad9c969979ad9b0b"
},
"outputs": [
{
"data": {
"text/plain": [
"array([[32]])"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = np.array([[1], [2], [3]])\n",
"y = np.array([[4], [5], [6]])\n",
"\n",
"x.T @ y # 또는 np.dot(x.T, y)"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "bec85acb3bbe49ddb4e3345daecfced8"
},
"source": [
"NumPy에서는 1차원 배열끼리도 내적을 계산한다. 이 때는 NumPy가 앞의 벡터는 행 벡터이고 뒤의 벡터는 열 벡터라고 가정한다."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"school_cell_uuid": "0cddf2f013324e719945dffbf85af20f"
},
"outputs": [
{
"data": {
"text/plain": [
"32"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = np.array([1, 2, 3])\n",
"y = np.array([4, 5, 6])\n",
"\n",
"x @ y # 또는 np.dot(x, y)"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "b6c82e49b1124ff9937d78277b64a52d"
},
"source": [
"왜 벡터의 내적은 덧셈이나 뺄셈과 달리 이렇게 복잡하게 정의된 것일까. 그 이유는 데이터 분석을 할 때 이러한 연산을 필요하기 때문이다. 벡터의 내적을 사용하여 데이터를 분석하는 몇 가지 예를 살펴보자."
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "52306dedaf4a4ef3b3b9962fe784d772"
},
"source": [
"### 가중합"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "7b2e2ce1a713483e9d6103c053dcdd78"
},
"source": [
"벡터의 내적은 가중합을 계산할 때 쓰일 수 있다. **가중합(weighted sum)**이란 복수의 데이터를 단순히 합하는 것이 아니라 각각의 수에 어떤 가중치 값을 곱한 후 이 곱셈 결과들을 다시 합한 것을 말한다. \n",
"\n",
"만약 데이터 벡터가 $x=[x_1, \\cdots, x_N]^T$ 이고 가중치 벡터가 $w=[w_1, \\cdots, w_N]^T$ 이면 데이터 벡터의 가중합은 다음과 같다.\n",
"\n",
"$$ \n",
"\\begin{align}\n",
"w_1 x_1 + \\cdots + w_N x_N = \\sum_{i=1}^N w_i x_i \n",
"\\tag{2.2.10}\n",
"\\end{align}\n",
"$$ \n",
"\n",
"이 값을 벡터 $x$와 $w$의 곱으로 나타내면 $w^Tx$ 또는 $x^Tw$ 라는 간단한 수식으로 표시할 수 있다.\n",
"\n",
"$$ \n",
"\\begin{align}\n",
"\\begin{aligned}\n",
"\\sum_{i=1}^N w_i x_i \n",
"&= \n",
"\\begin{bmatrix}\n",
"w_{1} && w_{2} && \\cdots && w_{N}\n",
"\\end{bmatrix}\n",
"\\begin{bmatrix}\n",
"x_1 \\\\ x_2 \\\\ \\vdots \\\\ x_N\n",
"\\end{bmatrix} \n",
"&= w^Tx \n",
"\\\\\n",
"&=\n",
"\\begin{bmatrix}\n",
"x_{1} && x_{2} && \\cdots && x_{N}\n",
"\\end{bmatrix}\n",
"\\begin{bmatrix}\n",
"w_1 \\\\ w_2 \\\\ \\vdots \\\\ w_N\n",
"\\end{bmatrix}\n",
"&= x^Tw \n",
"\\end{aligned}\n",
"\\tag{2.2.11}\n",
"\\end{align}\n",
"$$\n",
"\n",
"예를 들어 쇼핑을 할 때 각 물건의 가격은 데이터 벡터, 각 물건의 수량은 가중치로 생각하여 내적을 구하면 총금액을 계산할 수 있다.\n",
"\n",
"만약 가중치가 모두 1이면 일반적인 합(sum)을 계산한다.\n",
"\n",
"$$ \n",
"w_1 = w_2 = \\cdots = w_N = 1 \n",
"$$\n",
"\n",
"또는\n",
"\n",
"$$\n",
"\\begin{align}\n",
"w = \\mathbf{1}_N \n",
"\\tag{2.2.12}\n",
"\\end{align}\n",
"$$\n",
"\n",
"이면 \n",
"\n",
"$$ \n",
"\\begin{align}\n",
"\\sum_{i=1}^N x_i = \\mathbf{1}_N^T x \n",
"\\tag{2.2.13}\n",
"\\end{align}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"bootstrap": {
"panel": {
"class": "panel-default"
}
},
"school_cell_uuid": "6c189202c6694fb2a74a8a9d64b37b94"
},
"source": [
"#### 연습 문제 2.2.1\n",
"\n",
"A, B, C 세 회사의 주식은 각각 100만원, 80만원, 50만원이다. 이 주식을 각각 3주, 4주, 5주를 매수할 때 필요한 금액을 구하고자 한다.\n",
"\n",
"(1) 주식의 가격과 수량을 각각 $p$ 벡터, $n$ 벡터로 표시하고 NumPy로 코딩한다.\n",
"\n",
"(2) 주식을 매수할 때 필요한 금액을 곱셈으로 표시하고 NumPy 연산으로 그 값을 계산한다."
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "5d686a31e45d489ab0be314fca3fd57a"
},
"source": [
"### 가중평균"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "52190e8b43a94001bb3b87357e8bce60"
},
"source": [
"가중합의 가중치값을 전체 가중치값의 합으로 나누면 **가중평균(weighted average)**이 된다. 가중평균은 대학교의 평균 성적 계산 등에 사용할 수 있다.\n",
"\n",
"예를 들어 고등학교에서는 국어, 영어, 두 과목의 평균 점수를 구할 때 단순히 두 과목의 점수(숫자)를 더한 후 2으로 나눈다. 그러나 대학교에서는 중요한 과목과 중요하지 않는 과목을 구분하는 학점(credit)이라는 숫자가 있다. 일주일에 한 시간만 수업하는 과목은 1학점짜리 과목이고 일주일에 세 시간씩 수업하는 중요한 과목은 3학점짜리 과목이다. 1학점과 3학점 과목의 점수가 각각 100점, 60점이면 학점을 고려한 가중 평균(weighted average) 성적은 다음과 같이 계산한다.\n",
"\n",
"$$ \n",
"\\dfrac{1}{1 + 3} \\times 100 + \\dfrac{3}{1 + 3} \\times 60\n",
"= 70 \n",
"$$\n",
"\n",
"\n",
"벡터로 표현된 $N$개의 데이터의 단순 평균은 다음처럼 생각할 수 있다.\n",
"\n",
"$$\n",
"\\begin{align}\n",
"\\bar{x} = \\dfrac{1}{N}\\sum_{i=1}^N x_i = \\dfrac{1}{N} \\mathbf{1}_N^T x\n",
"\\tag{2.2.14}\n",
"\\end{align}\n",
"$$\n",
"\n",
"위 수식에서 보인 것처럼 $x$ 데이터의 평균은 보통 $\\bar{x}$라는 기호로 표기하고 \"엑스 바(x bar)\" 라고 읽는다.\n",
"\n",
"다음은 NumPy로 평균을 계산하는 방법이다."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"school_cell_uuid": "92725f510e5a426ba9c9f050e8d90e83"
},
"outputs": [
{
"data": {
"text/plain": [
"4.5"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = np.arange(10)\n",
"N = len(x)\n",
"\n",
"np.ones(N) @ x / N"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "3fd76b76bf514970b2c0bda365fd712e"
},
"source": [
"현실적으로는 ``mean`` 이라는 메서드를 사용하는 것이 편하다."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"school_cell_uuid": "ed7a3c2a58294d548af6b1d38f456d64"
},
"outputs": [
{
"data": {
"text/plain": [
"4.5"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x.mean()"
]
},
{
"cell_type": "markdown",
"metadata": {
"bootstrap": {
"panel": {
"class": "panel-default"
}
},
"school_cell_uuid": "6c189202c6694fb2a74a8a9d64b37b94"
},
"source": [
"#### 연습 문제 2.2.2\n",
"\n",
"벡터 $x$의 평균 제거 벡터는 다음과 같이 계산함을 증명하라.\n",
"\n",
"$$ \n",
"\\begin{align}\n",
"x - \\dfrac{1}{N}\\mathbf{1}_N^Tx \\mathbf{1}^{}\n",
"\\tag{2.2.15}\n",
"\\end{align}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "527c7645de0d4ce195a00597bd0b006a"
},
"source": [
"### 유사도"
]
},
{
"cell_type": "markdown",
"metadata": {
"school_cell_uuid": "faa387c866e148cabbbc043be254a0a3"
},
"source": [
"벡터의 곱셈(내적)은 두 벡터간의 유사도를 계산하는데도 이용할 수 있다. **유사도(similarity)는 두 벡터가 닮은 정도를 정량적으로 나타낸 값**으로 두 벡터가 비슷한 경우에는 유사도가 커지고 비슷하지 앟은 경우에는 유사도가 작아진다. 내적을 이용하면 **코사인 유사도(cosine similarity)**라는 유사도를 계산할 수 있다. 추후 선형대수의 기하학적 의미를 공부할 때 코사인 유사도에 대해 살펴볼 것이다.\n",
"\n",
"예를 들어 0과 1을 나타내는 MNIST 이미지에 대해 내적을 계산해 보자."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"school_cell_uuid": "93c8a93c97f34cc68e57d51e9660d347"
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"