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

선형대수와 해석기하

중요 개념

  • 벡터 화살표
  • 벡터의 길이, 단위 벡터
  • 벡터의 합과 차
  • 벡터의 분해와 성분
  • 두 벡터 사이의 각도과 직교
  • 벡터의 투영
  • 직선의 방정식
  • 직선과 점의 거리
  • 벡터의 선형 종속과 선형 독립
  • 기저 벡터
  • 좌표와 좌표 변환

벡터의 기하학적 의미

$N$차원 벡터(vector) $a$는 $N$차원의 공간상에서

  • 벡터 $a$의 값으로 표시되는 점(point) 또는
  • 원점과 벡터 $a$의 값으로 표시되는 점을 연결한 화살표(arrow)로 간주할 수 있다.

예를 들어 2차원 벡터 $a = [a_1 \;\; a_2]^T$ 는 2차원 상의 공간에서 $x$좌표가 $a_1$, $y$좌표가 $a_2$인 점, 또는 원점에서 이 점을 가리키는 화살표가 된다.

$$ a = \begin{bmatrix}1 \\ 2 \end{bmatrix} $$
In:
a = np.array([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()

벡터의 길이

2차원 벡터 $a$의 길이는 피타고라스 정리를 이용하여 놈(norm) $\| a \|$으로 계산할 수 있다. 마찬가지로 다른 차원의 벡터의 길이도 다음과 같아 놈으로 정의한다.

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

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

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

단위 벡터

길이가 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)

벡터와 실수의 곱

벡터와 양의 실수를 곱하면 벡터의 방향은 변하지 않고 실수의 크기만큼 벡터의 길이가 커진다. 만약 음의 실수를 곱하면 벡터의 방향이 반대가 된다.

In:
a = np.array([1, 2])
b = 2 * a
c = -1 * a

plt.plot(0, 0, 'ro', ms=10)
plt.plot(b[0], b[1], 'ro', ms=10)
plt.annotate('', xy=b, xytext=(0,0), arrowprops=dict(facecolor='black'))
plt.text(0.35, 1.15, "$a$", fontdict={"size": 18})


plt.plot(0, 0, 'ro', ms=10)
plt.plot(c[0], c[1], 'ro', ms=10)
plt.annotate('', xy=c, xytext=(0,0), arrowprops=dict(facecolor='black'))

plt.xticks(np.arange(-5, 6))
plt.yticks(np.arange(-5, 6))
plt.xlim(-4.4, 5.4)
plt.ylim(-3.2, 5.2)
plt.show()

벡터의 합

벡터와 벡터의 합도 벡터가 된다. 이 때 두 벡터의 합으로 만들어진 벡터의 위치는 두 벡터를 이웃하는 변으로 가지는 평행사변형의 다른 쪽 모서리의 위치가 된다.

$$ 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, 5))
plt.yticks(np.arange(-1, 4))
plt.xlim(-1.4, 4.4)
plt.ylim(-0.6, 3.8)
plt.show()

또는 더하고자 하는 벡터의 끝점을 차례대로 연결하여 마지막 벡터가 가리키는 점으로 계산할 수도 있다.

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=c, xytext=a, 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(c[0], c[1], 'ro', ms=10)

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

plt.xticks(np.arange(-2, 5))
plt.yticks(np.arange(-1, 4))
plt.xlim(-1.4, 4.4)
plt.ylim(-0.6, 3.8)
plt.show()
In:
a = np.array([1, 2])
b = np.array([2, 1])
c = a + b

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

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

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

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

벡터의 차

벡터의 차 $a - b = c$는 벡터 $b$가 가리키는 점으로부터 벡터 $a$가 가리키는 점을 연결하는 벡터이다. 그 이유는 벡터 $b$에 벡터 $a-b$를 더하면 즉, 벡터 $b$와 벡터 $a-b$를연결하면 도록 벡터 $a$가 되어야 하기 때문이다.

$$ a - b = c $$$$ b + c = b + (a-b) = a $$
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=a, xytext=b, 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.text(0.35, 1.15, "$a$", fontdict={"size": 18})
plt.text(1.15, 0.25, "$b$", fontdict={"size": 18})
plt.text(1.55, 1.65, "$a-b$", fontdict={"size": 18})

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

Word2Vec

추후 공부하게 될 word2vec을 이용하면 하나의 단어를 공간상의 벡터로 표현할 수 있으며 이 벡터들은 단어의 의미에 따라 다름과 같은 평행사변형 관계를 가질 수도 있다.

woman = man + (queen - king)

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=a+b, xytext=b, arrowprops=dict(facecolor='gray'))

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.text(-0.35, -0.35, "$king$", fontdict={"size": 18})
plt.text(0.55, 2.35, "$queen$", fontdict={"size": 18})
plt.text(1.95, 0.65, "$man$", fontdict={"size": 18})
plt.text(2.95, 3.15, "$woman$", fontdict={"size": 18})

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

벡터의 분해와 성분

어떤 두 벡터 $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.35, 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 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)으로 볼 수 있다.

$$ a = a_1 \cdot e_1 + a_2 \cdot e_2 $$

이 식에서 $a_1$, $a_2$는 좌표라는 스칼라 값이고 $e_1$, $e_2$는 벡터라는 점에 유의한다.

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_2$", fontdict={"size": 18})
plt.text(0.5, -0.2, "$e_1$", 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()

변환 행렬

원래의 기저 벡터가 아닌 새로운 기저 벡터가 있다고 하자. 이 새로운 기저 벡터들의 좌표를 행렬 형태로 합쳐서 나타낸 것을 변환 행렬(transform matrix)이라고 한다.

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

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

이고

새로운 기저 벡터는

$$ g_1 = \dfrac{1}{\sqrt{2}} e_1 + \dfrac{1}{\sqrt{2}} e_2 $$$$ g_2 = -\dfrac{1}{\sqrt{2}} e_1 + \dfrac{1}{\sqrt{2}} e_2 $$

라고 하면 $e_1$, $e_2$에 대한 $g_1$, $g_2$의 좌표 벡터는 다음과 같다.

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

변환 행렬 $A$은 이를 합친 행렬이다.

$$ A = \begin{bmatrix} \dfrac{1}{\sqrt{2}} & -\dfrac{1}{\sqrt{2}} \\ \dfrac{1}{\sqrt{2}} & \dfrac{1}{\sqrt{2}} \end{bmatrix} $$

좌표 변환

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

새로운 기저 벡터에 대한 좌표 값이 가리키는 실제 위치는 원래의 벡터가 가리키는 실제 위치과 같아야 된다.

만약 2차원이라면 다음과 같은 관계가 성립한다.

$$ a'_1 \cdot g_1 + a'_2 \cdot g_2 = a_1 \cdot e_1 + a_2 \cdot e_2 $$

$$ 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} $$

즉 $$ a = 2\sqrt{2} \cdot g_1 + 0 \cdot g_2 $$

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_2$", fontdict={"size": 18})
plt.text(0.5, -0.2, "$e_1$", 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.        ])

이미지 변환

좌표 변환을 응용하면 이미지를 자유롭게 변환할 수도 있다.

In:
import scipy.misc

f = -1 * sp.misc.face(gray=True)
plt.imshow(f)
plt.grid(False)
plt.show()
In:
import scipy.ndimage

f1 = sp.ndimage.affine_transform(f, A)
plt.imshow(f1)
plt.grid(False)
plt.show()

질문/덧글

내적을 표현하는 방법 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 오전

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

사용자에 의해 삭제되었습니다. fudi*** 2017년 4월 20일 1:37 오후

사용자에 의해 삭제되었습니다.