작성자: admin 작성일시: 2016-06-16 23:33:11 조회수: 1030 다운로드: 48
카테고리: 기초 수학 태그목록:

선형대수와 해석기하

벡터의 기하학적 의미

길이가 $K$인 벡터(vector) $a$는 $K$차원의 공간에서 원점과 벡터 $a$의 값으로 표시되는 점을 연결한 화살표(arrow)로 간주할 수 있다.

$$ a = \begin{bmatrix}1 \\ 2 \end{bmatrix} $$
In:
a = [1, 2]

plt.annotate('', xy=a, xytext=(0,0), arrowprops=dict(facecolor='black'))
plt.plot(0, 0, 'ro', ms=10)
plt.plot(a[0], a[1], 'ro', ms=10)
plt.text(0.35, 1.15, "$a$", fontdict={"size": 18})
plt.xticks(np.arange(-2, 4))
plt.yticks(np.arange(-1, 4))
plt.xlim(-2.4, 3.4)
plt.ylim(-1.2, 3.2)
plt.show()

벡터의 길이

벡터 $a$ 의 길이를 놈(norm) $\| a \|$ 이라고 하며 다음과 같이 계산할 수 있다.

$$ \| a \| = \sqrt{a^T a } = \sqrt{a_1^2 + \cdots + a_K^2} $$

numpy의 linalg 서브 패키지의 norm 명령으로 벡터의 길이를 계산할 수 있다.

In:
a = np.array([1, 1])
np.linalg.norm(a)
Out:
1.4142135623730951

단위 벡터

길이가 1인 벡터를 단위 벡터(unit vector)라고 한다. 예를 들어 다음과 같은 벡터들은 모두 단위 벡터이다.

$$ a = \begin{bmatrix}1 \\ 0\end{bmatrix} ,\;\; b = \begin{bmatrix}0 \\ 1\end{bmatrix} ,\;\; c = \begin{bmatrix} \dfrac{1}{\sqrt{2}} \\ \dfrac{1}{\sqrt{2}} \end{bmatrix} $$

임의의 벡터 $x$에 대해 다음은 벡터는 단위 벡터가 된다.

$$ \dfrac{x}{\| x \|} $$
In:
a = np.array([1, 0])
b = np.array([0, 1])
c = np.array([1/np.sqrt(2), 1/np.sqrt(2)])
np.linalg.norm(a), np.linalg.norm(b), np.linalg.norm(c)
Out:
(1.0, 1.0, 0.99999999999999989)

벡터의 합

벡터와 벡터의 합은 벡터가 된다.

$$ a = \begin{bmatrix}1 \\ 2\end{bmatrix} ,\;\; b = \begin{bmatrix}2 \\ 1\end{bmatrix} \;\;\; \rightarrow \;\;\; c = a + b = \begin{bmatrix}3 \\ 3\end{bmatrix} \;\; $$
In:
a = np.array([1, 2])
b = np.array([2, 1])
c = a + b

plt.annotate('', xy=a, xytext=(0,0), arrowprops=dict(facecolor='gray'))
plt.annotate('', xy=b, xytext=(0,0), arrowprops=dict(facecolor='gray'))
plt.annotate('', xy=c, xytext=(0,0), arrowprops=dict(facecolor='black'))

plt.plot(0, 0, 'ro', ms=10)
plt.plot(a[0], a[1], 'ro', ms=10)
plt.plot(b[0], b[1], 'ro', ms=10)
plt.plot(c[0], c[1], 'ro', ms=10)
plt.plot([a[0], c[0]], [a[1], c[1]], 'k--')
plt.plot([b[0], c[0]], [b[1], c[1]], 'k--')

plt.text(0.35, 1.15, "$a$", fontdict={"size": 18})
plt.text(1.15, 0.25, "$b$", fontdict={"size": 18})
plt.text(1.25, 1.45, "$c$", fontdict={"size": 18})

plt.xticks(np.arange(-2, 4))
plt.yticks(np.arange(-1, 4))
plt.xlim(-1.4, 4.4)
plt.ylim(-0.6, 3.8)
plt.show()

벡터의 집합 중에서 집합의 원소인 두 벡터의 선형 조합(스칼라 곱의 합)이 그 집합의 원소이면 벡터 공간이라고 한다.

$$ a, b \in \mathbf{R} \;\; \text{ and } \;\; \alpha_1a + \alpha_2b \in \mathbf{R} $$

벡터의 분해

어떤 두 벡터 $a$, $b$의 합이 다른 벡터 $c$가 될 때 $c$가 두 벡터 성분(vector component) $a$, $b$으로 분해(decomposition)된다고 말할 수 있다.

두 벡터의 내적

두 벡터의 내적은 다음과 같이 벡터의 길이 $\|a\|$, $\|b\|$ 와 두 벡터 사이의 각도 $\theta$로 계산할 수도 있다.

$$ a^Tb = \|a\|\|b\| \cos\theta $$

(증명)

위 식은 2차원 벡터의 경우 다음과 같이 증명할 수 있다.

위 그림과 같은 삼각형에서 세 변은 다음과 같은 공식을 만족한다. (코사인 법칙)

$$ \|a−b\|^2=\|a\|^2+\|b\|^2−2\|a\|\|b\|\cos\theta $$$$ \begin{eqnarray} \|a−b\|^2 &=& (a−b)^T(a−b) \\ &=& a^Ta − 2 ( a^Tb ) + b^T b \\ &=& \|a\|^2+\|b\|^2 − 2 a^T b \end{eqnarray} $$

두 식이 같으므로

$$ a^Tb = \|a\|\|b\| \cos\theta $$

벡터의 직교

두 벡터 $a$와 $b$가 이루는 각이 90도이면 서로 직교(orthogonal)라고 하며 $ a \perp b $로 표시한다.

$\cos 90^{\circ} = 0$이므로 서로 직교인 두 벡터의 벡터 내적(inner product, dot product)는 0이된다.

$$ a^T b = b^T a = 0 \;\;\;\; \leftrightarrow \;\;\;\; a \perp b $$

예를 들어 다음 두 벡터는 서로 직교한다.

$$ a = \begin{bmatrix}1 \\ 1\end{bmatrix} ,\;\; b = \begin{bmatrix}-1 \\ 1\end{bmatrix} \;\;\;\; \rightarrow \;\;\;\; a^T b = \begin{bmatrix}1 & 1\end{bmatrix} \begin{bmatrix}-1 \\ 1\end{bmatrix} = -1 + 1 = 0 $$
In:
a = np.array([1, 1])
b = np.array([-1, 1])
np.dot(a, b)
Out:
0

투영

벡터 $a$를 다른 벡터 $b$에 직교하는 성분 $a_1$ 와 나머지 성분 $a_2 = a - a_1$로 분해할 수 있다. 이 때 $a_2$는 $b$와 평행하며 이 길이를 벡터 $a$의 벡터 $b$에 대한 투영(projection)이라고 한다.

벡터의 투영은 다음과 같이 내적을 사용하여 구할 수 있다.

$$ a = a_1 + a_2 $$$$ a_1 \perp b \;\; \text{ and } \;\; a_2 = a - a_1 $$

이면

$$ \| a_2 \| = a^T\dfrac{b}{\|b\|} = \dfrac{a^Tb}{\|b\|} = \dfrac{b^Ta}{\|b\|} $$

이다.

In:
a = np.array([1, 2])
b = np.array([2, 0])
a2 = np.dot(a, b)/np.linalg.norm(b) * np.array([1, 0])
a1 = a - a2

plt.annotate('', xy=a, xytext=(0,0), arrowprops=dict(facecolor='gray'))
plt.annotate('', xy=b, xytext=(0,0), arrowprops=dict(facecolor='gray'))
plt.annotate('', xy=a2, xytext=(0,0), arrowprops=dict(facecolor='green'))
plt.annotate('', xy=a1, xytext=(0,0), arrowprops=dict(facecolor='green'))

plt.plot(0, 0, 'ro', ms=10)
plt.plot(a[0], a[1], 'ro', ms=10)
plt.plot(b[0], b[1], 'ro', ms=10)

plt.text(0.35, 1.15, "$a$", fontdict={"size": 18})
plt.text(1.55, 0.15, "$b$", fontdict={"size": 18})
plt.text(-0.2, 1.05, "$a_1$", fontdict={"size": 18})
plt.text(0.50, 0.15, "$a_2$", fontdict={"size": 18})

plt.xticks(np.arange(-2, 4))
plt.yticks(np.arange(-1, 4))
plt.xlim(-1.5, 3.5)
plt.ylim(-0.5, 3)
plt.show()

직선

벡터 공간에서 직선은 다음과 같은 함수로 표현할 수 있다.

$$ f(x) = w^T(x - w) = w^Tx - w^Tw = w^Tx - \| w \|^2 = w^Tx - w_0 = 0 $$

$x$는 직선 상의 점을 나타내는 벡터이고 $w$는 원점으로부터 직선까지 이어지는 수직선을 나타내는 벡터이다. $x-w$ 벡터가 $w$ 벡터와 수직이라는 것은 $x$가 가리키는 점과 $w$가 가리키는 점을 이은 선이 $w$와 수직이라는 뜻이다.

예를 들어

$$ w = \begin{bmatrix}1 \\ 2\end{bmatrix} ,\;\; w_0 = 5 $$

일 때

$$ \begin{bmatrix}1 & 2\end{bmatrix} \begin{bmatrix}x_1 \\ x_2 \end{bmatrix} - 5 = x_1 + 2x_2 - 5 = 0 $$

이면 벡터 $w$가 가리키는 점 (1, 2)를 지나면서 벡터 $w$에 수직인 선을 뜻한다.

In:
w = np.array([1, 2])
x1 = np.array([3, 1])
x2 = np.array([-1, 3])
w0 = 5

plt.annotate('', xy=w, xytext=(0,0), arrowprops=dict(facecolor='red'))
plt.annotate('', xy=x1, xytext=(0,0), arrowprops=dict(facecolor='gray'))
plt.annotate('', xy=x2, xytext=(0,0), arrowprops=dict(facecolor='gray'))

plt.plot(0, 0, 'ro', ms=10)
plt.plot(w[0], w[1], 'ro', ms=10)
plt.plot(x1[0], x1[1], 'ro', ms=10)
plt.plot(x2[0], x2[1], 'ro', ms=10)
plt.plot([-3, 5], [4, 0], 'r-', lw=5)

plt.text(0.35, 1.15, "$w$", fontdict={"size": 18})
plt.text(1.55, 0.25, "$x_1$", fontdict={"size": 18})
plt.text(-0.9, 1.40, "$x_2$", fontdict={"size": 18})

plt.xticks(np.arange(-2, 4))
plt.yticks(np.arange(-1, 4))
plt.xlim(-1.7, 4.2)
plt.ylim(-0.5, 3.5)
plt.show()

직선과 점의 거리

직선 $w^Tx - w_0 = 0$ 과 이 직선 위에 있지 않은 점 $x'$의 거리는 단위 벡터 $\dfrac{w}{\|w\|}$에 대한 $x'$의 투영에서 $\|w\|$를 뺀 값의 절대값이다. 따라서 다음과 같이 정리할 수 있다.

$$ \left| \dfrac{w^Tx'}{\|w\|} - \|w\| \right| = \dfrac{\left|w^Tx' - \|w\|^2 \right|}{\|w\|}= \dfrac{\left|w^Tx' - w_0 \right|}{\|w\|} $$

벡터의 선형 종속과 선형 독립

벡터들의 선형 조합이 0이 되는 모두 0이 아닌 스칼라값들이 존재하면 그 벡터들은 선형 종속(linearly dependent)이라고 한다.

$$ a = \begin{bmatrix}1 \\ 2\end{bmatrix} ,\;\; b = \begin{bmatrix}3 \\ 3\end{bmatrix} \;\; c = \begin{bmatrix}10 \\ 14\end{bmatrix} \;\; $$$$ 2a + b - \frac{1}{2}c = 0 $$
In:
a = np.array([1, 2])
b = np.array([3, 3])
c = np.array([10, 14])
2*a + b - 0.5*c
Out:
array([ 0.,  0.])

벡터들의 선형 조합이 0이 되는 모두 0이 아닌 스칼라값들이 존재하지 않으면 그 벡터들은 선형 독립(linearly independent)이라고 한다.

$$ \alpha_1 a_1 + \cdots + \alpha_K a_K = 0 \;\;\;\; \leftrightarrow \;\;\;\; \alpha_1 = \cdots = \alpha_K = 0 $$

기저 벡터

벡터 공간에 속하는 벡터의 집합이 선형 독립이고 다른 모든 벡터 공간의 벡터들이 그 벡터 집합의 선형 조합으로 나타나면 그 벡터 집합을 벡터 공간의 기저 벡터(basis vector)라고 한다.

예를 들어 다음과 같은 두 벡터는 2차원 벡터 공간의 기저 벡터이다. $$ a = \begin{bmatrix}1 \\ 0\end{bmatrix} ,\;\; b = \begin{bmatrix}0 \\ 1\end{bmatrix} \;\; $$ 또는 $$ a = \begin{bmatrix}1 \\ 1\end{bmatrix} ,\;\; b = \begin{bmatrix}2 \\ 3\end{bmatrix} \;\; $$

다음과 같은 두 벡터는 2차원 벡터 공간의 기저 벡터가 될 수 없다. $$ a = \begin{bmatrix}1 \\ 2\end{bmatrix} ,\;\; b = \begin{bmatrix}2 \\ 4\end{bmatrix} \;\; $$

열 공간

행렬은 열 벡터의 집합으로 볼 수 있다. 이 때 열 벡터들의 조합으로 생성되는 벡터 공간을 열 공간(column space)이라고 한다.

$$ A = \begin{bmatrix} 1 & 5 & 6 \\ 2 & 6 & 8 \\ 7 & 1 & 8 \end{bmatrix} \;\;\;\; \rightarrow \;\;\;\; \alpha_1 \begin{bmatrix} 1 \\ 2 \\ 7 \end{bmatrix} + \alpha_2 \begin{bmatrix} 5 \\ 6 \\ 1 \end{bmatrix} + \alpha_3 \begin{bmatrix} 6 \\ 8 \\ 8 \end{bmatrix} \; \in \; \text{column space} $$

열 랭크

행렬의 열 벡터 중 서로 독립인 열 벡터의 최대 갯수를 열 랭크(column rank) 혹은 랭크(rank)라고 한다.

예를 들어 다음 행렬의 랭크는 2이다.

$$ A = \begin{bmatrix} 1 & 5 & 6 \\ 2 & 6 & 8 \\ 3 & 11 & 14 \end{bmatrix} $$

numpy의 linalg 서브 패키지의 matrix_rank 명령으로 랭크를 계산할 수 있다.

In:
A = np.array([[1, 5, 6], [2, 6, 8], [3, 11, 14]])
np.linalg.matrix_rank(A)
Out:
2

좌표

벡터의 성분, 즉 좌표(coordinate)는 표준 기저 벡터들에 대한 해당 벡터의 투영(projection)으로 볼 수 있다.

In:
e1 = np.array([1, 0])
e2 = np.array([0, 1])
a = np.array([2, 2])

plt.annotate('', xy=e1, xytext=(0,0), arrowprops=dict(facecolor='green'))
plt.annotate('', xy=e2, xytext=(0,0), arrowprops=dict(facecolor='green'))
plt.annotate('', xy=a, xytext=(0,0), arrowprops=dict(facecolor='gray'))

plt.plot(0, 0, 'ro', ms=10)
plt.plot(a[0], a[1], 'ro', ms=10)

plt.text(1.05, 1.35, "$a$", fontdict={"size": 18})
plt.text(-0.3, 0.5, "$e_1$", fontdict={"size": 18})
plt.text(0.5, -0.2, "$e_2$", fontdict={"size": 18})

plt.xticks(np.arange(-2, 4))
plt.yticks(np.arange(-1, 4))
plt.xlim(-1.5, 3.5)
plt.ylim(-0.5, 3)
plt.show()

좌표 변환

새로운 기저 벡터를에 대해 벡터 투영을 계산하는 것을 좌표 변환(coordinate transform)이라고 한다.

좌표 변환은 새로운 기저 벡터로 이루어진 변환 행렬(transform matrix) $A$ 와의 내적으로 계산한다.

$$ Aa' = a $$$$ a' = A^{-1}a $$

예를 들어, 기존의 기저 벡터가

$$ e_1 = \begin{bmatrix}1 \\ 0\end{bmatrix} ,\;\; e_2 = \begin{bmatrix}0 \\ 1\end{bmatrix} \;\; $$

이면 벡터 $a$는 사실

$$ a = \begin{bmatrix}2 \\ 2\end{bmatrix} = 2 \begin{bmatrix}1 \\ 0\end{bmatrix} + 2 \begin{bmatrix}0 \\ 1 \end{bmatrix} = 2 e_1 + 2 e_2 $$

새로운 기저 벡터가

$$ g_1 = \begin{bmatrix} \dfrac{1}{\sqrt{2}} \\ \dfrac{1}{\sqrt{2}} \end{bmatrix} ,\;\; g_2 = \begin{bmatrix} -\dfrac{1}{\sqrt{2}} \\ \dfrac{1}{\sqrt{2}} \end{bmatrix} ,\;\; $$

이면 벡터 $a$의 좌표는 다음과 같이 바뀐다.

$$ a = \begin{bmatrix}2 \\ 2\end{bmatrix} \;\;\;\; \rightarrow \;\;\;\; a' = A^{-1}a = \begin{bmatrix} e'_1 & e'_2 \end{bmatrix} a = \begin{bmatrix} \dfrac{1}{\sqrt{2}} & -\dfrac{1}{\sqrt{2}} \\ \dfrac{1}{\sqrt{2}} & \dfrac{1}{\sqrt{2}} \end{bmatrix}^{-1} \begin{bmatrix}2 \\ 2\end{bmatrix} = \begin{bmatrix} \dfrac{1}{\sqrt{2}} & \dfrac{1}{\sqrt{2}} \\ -\dfrac{1}{\sqrt{2}} & \dfrac{1}{\sqrt{2}} \end{bmatrix} \begin{bmatrix}2 \\ 2\end{bmatrix} = \begin{bmatrix}2\sqrt{2}\\0\end{bmatrix} $$
In:
e1 = np.array([1, 0])
e2 = np.array([0, 1])
a = np.array([2, 2])
g1 = np.array([1, 1])/np.sqrt(2)
g2 = np.array([-1, 1])/np.sqrt(2)

plt.annotate('', xy=e1, xytext=(0,0), arrowprops=dict(facecolor='green'))
plt.annotate('', xy=e2, xytext=(0,0), arrowprops=dict(facecolor='green'))
plt.annotate('', xy=g1, xytext=(0,0), arrowprops=dict(facecolor='red'))
plt.annotate('', xy=g2, xytext=(0,0), arrowprops=dict(facecolor='red'))
plt.annotate('', xy=a, xytext=(0,0), arrowprops=dict(facecolor='gray', alpha=0.5))

plt.plot(0, 0, 'ro', ms=10)
plt.plot(a[0], a[1], 'ro', ms=10)

plt.text(1.05, 1.35, "$a$", fontdict={"size": 18})
plt.text(-0.3, 0.5, "$e_1$", fontdict={"size": 18})
plt.text(0.5, -0.2, "$e_2$", fontdict={"size": 18})
plt.text(0.2, 0.5, "$g_1$", fontdict={"size": 18})
plt.text(-0.6, 0.2, "$g_2$", fontdict={"size": 18})

plt.xticks(np.arange(-2, 4))
plt.yticks(np.arange(-1, 4))
plt.xlim(-1.5, 3.5)
plt.ylim(-0.5, 3)
plt.show()
In:
A = np.vstack([g1, g2]).T
A
Out:
array([[ 0.70710678, -0.70710678],
       [ 0.70710678,  0.70710678]])
In:
Ainv = np.linalg.inv(A)
Ainv
Out:
array([[ 0.70710678,  0.70710678],
       [-0.70710678,  0.70710678]])
In:
Ainv.dot(a)
Out:
array([ 2.82842712,  0.        ])

질문/덧글

내적을 표현하는 방법 tada*** 2016년 7월 3일 12:33 오후

벡터의 내적에 있는 코드에서
np.array(a, b)를 np.array(a.T, b)라고 쓰면 안되나요? 만약 쓸수 있다면 두개의 차이는 무엇인가요?

답변: 내적을 표현하는 방법 관리자 2016년 7월 3일 11:49 오후

(1) np.array 명령은 list 자료를 ndarray 자료로 만드는 utility function 이지 내적을 계산하는 명령이 아닙니다. np.dot 명령이 내적을 구하는 명령입니다.

(2) 원래 2차원 배열 a, b 에 대해서는 np.dot(a, b) 와 np.dot(a.T, b) 가 다른 계산을 의미합니다. 따라서 a.shape = (3,1), b.shape = (3,1) 이면 np.dot(a, b) 는 계산 불가능하고 np.dot(a.T, b) 는 계산가능합니다. 다만 a, b 가 1차원 배열일 경우에는 a, b가 내적 계산 가능한 형태의 2차원 배열이라고 가정하므로 np.dot(a, b), np.dot(a.T, b) 모두 내적을 계산해 줍니다.

벡터의 선형 독립 moon*** 2016년 10월 11일 6:02 오후

n개 벡터의 선형 독립 여부는 결국 n-1 벡터들의 실수 배 합으로 나머지 1개의 벡터를 나타낼 수 있는지 여부를 확인하는 것으로 이해됩니다.

그럼 n=3인 경우에는

2개의 벡터로는( 서로 평행하지 않은 경우) 다른 벡터 하나를 무조건 표현할 수 있으니까

선형독립일 경우는 없다고 이해해도 괜찮을까요?

답변: 벡터의 선형 독립 관리자 2016년 10월 12일 7:14 오후

"n=3인 경우"라는 말이 3차원 벡터를 의미한다면 "2개의 3차원 벡터로는 다른 벡터 하나를 무조건 표현하지 못합니다".
2개의 3차원 벡터가 이루는 평면상에 있지 않은 벡터는 모두 표현할 수 없습니다.

답변: 답변: 벡터의 선형 독립 moon*** 2016년 10월 12일 9:43 오후

아 제가 사용한 n=3이라는 의미는 3개의 2차원 벡터를 가리키는 것이었습니다.

답변: 답변: 답변: 벡터의 선형 독립 관리자 2016년 10월 12일 9:49 오후

네, n=3이 3개라는 뜻이라면 말씀하신대로 서로 평행하지 않은 경우에는 독립일 수 없습니다.

직선의 설명 부분 질문 crys*** 2016년 10월 15일 5:57 오후

좋은 강의 감사드립니다.

직선의 설명 중 x는 그림에서 직선으로, w는 선분으로 이해가 되는데요,
(x−w 벡터가 w 벡터와 수직이라는 것은) 'x가 가리키는 점과 w가 가리키는 점을 이은 선이 w와 수직이라는 뜻'에서,
직선 x와 직선 w가 수직이라는 의미인지,
아니면 '특정한 점과 특정한 점을 이은 선'이 w와 수직이라는 의미인지요?

답변: 직선의 설명 부분 질문 관리자 2016년 10월 16일 10:48 오전

이 식은 직선을 이루는 모든 점 x에 대해 적용됩니다.
직선의 모든 점 x에 대해 x - w라는 벡터를 계산할 수 있고 이 벡터가 w 벡터와 수직이 된다는 의미입니다.

열랭크에서 supe*** 2016년 10월 23일 4:47 오후

"행렬의 열 벡터 중 서로 독립인 열 벡터의 최대 갯수를 열 랭크(column rank) 혹은 랭크(rank)라고 한다." -> 여기서 '독립'은 선형독립을 말하는 건가요? 혹시 아니라면 여기서 독립은 어떤 의미인지 궁금합니다.

답변: 열랭크에서 관리자 2016년 10월 24일 7:25 오전

네, 선형 독립을 의미합니다.