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

선형대수와 해석기하

중요 개념

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

벡터의 기하학적 의미

$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$과 벡터 $b$에 평행한 성분 $a_2$로 분해할 수 있는 데, 이 때 성분 $a_2$의 길이를 벡터 $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()