직교적 투영(Orthogonal Projection)
그림 1의 벡터 bproj는 벡터 a위로 수직으로 조사된 빛에 의해 투영된 벡터 b의 그림자에 대한 위치벡터로 정사영(Orthogonal projection)이라 합니다.
a=np.array([[3], [3]]) q, r=la.qr(a) plt.figure(figsize=(3,2)) plt.arrow(0,0, a[0,0], a[1,0], head_width=0.09) plt.arrow(0, 0, -r[0,0], 0, alpha=0.6, head_width=0.09, color="brown") plt.arrow(0,0, 3, 0, lw=2, head_width=0.09, color="b") plt.vlines(3, 0, 3.2, ls="--", color="g") plt.text(2.5, 0.2, r"$90^o$", color="g") plt.text(0.3, 0.1, r"$\theta$", color="g") plt.text(1.7, 2, r"$\vec{b}$") plt.text(1.5, 0.15, r"$\vec{b_{proj}}$", color="b") plt.text(3.5, 0.15, r"$\vec{a}}$", color="brown", alpha=0.6) plt.show()
식 1을 적용하여 그림 1의 두 벡터 a와 b 각각의 노름과 내적 (a·b)의 비로 cos(θ)를 계산할 수 있습니다. 또한 cos(θ)는 벡터 b와 정사영 bproj의 노름의 비로 나타낼 수 있습니다.
\begin{align}u \cdot v &= \Vert{u}\Vert \Vert{v}\Vert \cos(\theta) \\ \cos(\theta) &= \frac{u \cdot v}{\Vert{u}\Vert \Vert{v}\Vert}\end{align} | (식 1) |
‖bproj‖는 식 2와 같이 결정할 수 있습니다.
\begin{align} \cos(θ) & = \frac{\Vert{b_{text{proj}}} \Vert}{\Vert{b}\Vert}\\& = \frac{a \cdot b}{\Vert{a}\Vert \Vert{b}\Vert}\\ \therefore\; \Vert{b_{text{proj}}} \Vert &=\frac{a \cdot b}{\Vert{a}\Vert} \end{align} | (식 2) |
bproj는 벡터 a위에 위치한 b의 정사영이므로 정사영의 크기는 a의 단위 벡터에 대한 배수로 나타낼 수 있습니다. 그러므로 식 3과 같이 정사영은 두 벡터의 내적과 노름에 의해 계산될 수 있습니다.
\begin{align}a_\text{unit}& = \frac{a}{\Vert{a}\Vert}\\ b_\text{proj}& = \frac{a \cdot b}{\Vert{a}\Vert} \frac{a}{\Vert{a}\Vert} \\ & = \frac{a \cdot b}{\Vert{a}\Vert} a_\text{unit} \end{align} | (식 3) |
예 1)
벡터 a위로의 벡터 b의 정사영 bproj를 계산합니다.
$$a=\begin{bmatrix}1\\0 \end{bmatrix}\quad b=\begin{bmatrix}2\\1 \end{bmatrix}$$
a=np.array([[1],[0]]) b=np.array([[2],[1]]) ab=np.dot(a.T, b) aNorm=(la.norm(a))**2 bProj=ab/aNorm *a print(bProj)
[[2.] [0.]]
위 결과는 그림 2와 같이 나타낼 수 있습니다.
a=np.array([1, 0]) b=np.array([2,1]) plt.figure(figsize=(3,2)) plt.arrow(0,0, a[0], a[1], lw=2, head_width=0.09, color="r") plt.arrow(0, 0, b[0], b[1], head_width=0.09, color="b") plt.arrow(0,0, 2, 0, head_width=0.09, color="b", alpha=0.6) plt.vlines(2, 0, 1.2, ls="--", color="g") plt.text(1.7, 0.1, r"$90^o$", color="g") plt.text(0.2, 0.03, r"$\theta$", color="g") plt.text(1.3, 0.7, r"$\vec{b}$", color="b") plt.text(1.3, 0.1, r"$\vec{b_{proj}}$", color="b") plt.text(0.5, 0.05, r"$\vec{a}}$", color="r") plt.show()
그림 3은 벡터 z을 구성하는 두 벡터를 나타낸 것입니다. 정사영을 이용하여 벡터 z을 구성하는 서로 직교되는 벡터들로 분해할 수 있습니다.
그림 3에서 α는 벡터 u를 조절하기 위해 사용되는 스칼라 입니다. 벡터 u위로의 벡터 z의 정사영 αu은 식 3을 적용하면 식 4와 같이 나타낼 수 있습니다.
\begin{align} αu &= \frac{z·u}{\Vert{u}\Vert}\frac{u}{\Vert{u}\Vert}\\ & = \frac{z·u}{u·u}u\\ \therefore\; \Vert{u}\Vert \Vert{u}\Vert &=u \cdot u \end{align} | (식 4) |
그림 3에서 z = v + αu와 같이 표현할 수 있으며 식 4을 대입하여 벡터 u에 수직인 벡터 v를 발견할 수 있습니다(식 5).
$$v = z − \frac{z·u}{u \cdot u}u$$ | (식 5) |
종합하면 z을 u 위로 직교 투영시킨 부분이 αu입니다. 마찬가지로 벡터 v는 z을 y축 위로 직교 투영된 부분이며 벡터 u에 직교성분입니다.
예 2)
다음 벡터 z이 벡터 u에 직교적 투영일 경우 u에 수직인 벡터를 결정합니다.
$$u=\begin{bmatrix}7\\6 \end{bmatrix}\quad v=\begin{bmatrix}4\\2 \end{bmatrix}$$
z=np.array([[7],[6]]) u=np.array([[4],[2]]) zu=np.dot(z.T, u);zu
array([[40]])
uu=np.dot(u.T,u);uu
array([[20]])
v=z-zu/uu*u print(v)
[[-1.] [ 2.]]
그림 4는 이 문제의 결과를 나타낸 것입니다. 이 그림에서 나타낸 것과 같이 임의의 벡터는 직교 투영을 사용하여 상호 수직인 두 벡터로 분해할 수 있습니다.
예 3)
벡터 u에 직교투영된 벡터 y의 yproj와 그 투영된 벡터의 수직인 (yproj)orth을 결정합니다.
$$y=\begin{bmatrix}-5\\3 \end{bmatrix} \quad u=\begin{bmatrix}3\\3 \end{bmatrix}$$
벡터 u 위에 y가 직교 투영된 벡터를 계산하는 것입니다.
y=np.array([[-5],[3]]) u=np.array([[3],[3]]) y_proj=np.dot(y.T, u)/np.dot(u.T, u)*u print(y_proj)
[[-1.] [-1.]]
벡터 y는 정사영 yproj와 그 벡터와 직교인 벡터 (yproj)orth와의 합이 됩니다. 그러므로 (yproj)orth는 식 6과 같이 계산할 수 있습니다.
\begin{align} y & = y_\text{proj} + ( y_\text{proj})_\text{orth} \\ ( y_\text{proj})_\text{orth} & = y - y_\text{proj} \end{align} | (식 6) |
y_projOrth=y-y_proj print(y_projOrth)
[[-4.] [ 4.]]
위 결과는 그림 5와 같이 시각화 할 수 있습니다.
댓글
댓글 쓰기