{
"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": "c4492121951f4e579317ddc73fc8b965"
},
"source": [
"이 절에서는 NumPy를 이용하여 벡터와 행렬의 연산을 실행하는 법도 공부한다. 다음처럼 NumPy와 matplotlib 패키지가 임포트되어 있어야 한다. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"school_cell_uuid": "5001990c745247b8a511163fe2d12b52"
},
"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": [
"