+ Projection / 프로젝션 / 투영
a벡터에 b벡터를 프로젝션시키면, b에서 a로 수선의 발을 내린다.
project b onto a 라고 표현. (b를 a에 수직으로 내림. 수직으로 내리면 최단거리가 됨.)
수선의 발을 p라 하면. p점은 a 선상에 있고 p벡터를 a벡터의 상수배로 볼 수 있다.
b벡터 끝에서 p벡터에 가는 벡터와 a 벡터는 수직이다. 따라서
수직인 벡터의 내적은 0이다. 열벡터에서 내적은 transpose의 곱으로 표현.
,
여기서 매트릭스 연산식으로 바꾸고, 파라미터를 b로 보고 시스템을 꺼내보면. 프로젝션한 포인트 p는
,
이렇게 된다. 프로젝션 시스템 P는
이 변환 시스템이 어떤 점을 a 벡터로 프로젝션시키는 시스템이다.
프로젝션의 의미?
project b onto a (b를 a로 프로젝션 시킨다.)
여기에서 는 a,b의 내적이다. b를 a에 내린 사영의 크기 * a벡터의 크기이고, 는 a벡터 / a 벡터크기의 제곱. 즉, a 방향의 단위벡터 / a벡터의 크기가 되고, 이 둘을 곱하면 a벡터 크기 부분이 없어지므로 a 방향이고, 크기가 b를 a에 내린 사영의 크기인 벡터가 된다. 즉, 프로젝션이 된다.
b벡터에서 a벡터의 성분을 얼만큼 갖고있는지를 나타냄. 내적은 닮은 정도를 나타내기도 한다. 해당 성분이 얼만큼 있는지 나타내므로 닮은 정도이기도 하다. ( 내적이 a b cos (theta) 라는 의미를 생각해 보면 알 수 있다. 닮은 정도를 cos 유사도로 표현하는 것도 비슷하다. 두 벡터의 사이 각도가 0에 가까울 수록 비슷하고 cos값이 최대가 된다. 반대 방향으로 갈수록 작아진다.)
+ 벡터의 투영과 최소 제곱
벡터와 평면이 수직인가를 알려면? 평면을 구성하는 기저벡터를 구하여 해당 벡터와 모두 수직인지 확인하면 된다.
임의 평면 x+2y+3z=0 의 기저 벡터를 구하려면?
위 방정식을 만족하는 독립인 벡터 두 개를 구하면 된다.
[1 1 1 ], [3 0 1]
위 두 개 벡터로 위 평면위의 모든 점을 스팬할 수 있다.
A는 위 기저벡터를 컬럼벡터로 하는 매트릭스로 어떤 시스템으로 볼 수 있다.
Ax는 위 평면위의 임의의 점이다. 기저벡터들의 선형결합으로 구성된 평면위의 점을 가리키는 벡터.
만약 평면 밖에 있는 b벡터를 A 평면에 내부의 벡터로 가장 가깝게 표현하려면??? 프로젝션!
즉, ||Ax-b||^2이 최소값이 되도록 한다. 최소제곱법.
Ax-b 벡터는 A 평면과 수직이다. 여기서 Ax는 b를 A 평면위에 프로젝션한 벡터이다. --> 최단 거리 지점.
b를 A에 프로젝션한 결과 :
+ 실전
그렇다면 여러 점들을 가장 최적의 라인(또는 평면) 하나로 표현하려면?
측정값: (x1,y1), (x2,y2), (x3, y3), ...
피팅라인: y=ax+b : 구하고자 하는 값 (a,b)
y1=ax1+b
y2=ax2+b
..
위 식을 모두 만족하는 a,b는 보통 존재하지 않는다. 다만 거리가 최소가 되도록 최적화된 라인을 찾을 수는 있다.
A x = b ( 왼쪽의 b는 위의 a,b 게수의 b와는 다른 것. y1,y2,y3를 말함)
x를 구하는 문제의 방정식을 만든다.
||Ax-b||^2 이 최소가 되게 하는 해를 구한다.
최소 거리를 만드는 문제는 프로젝션이다.
스페이스 밖의 점 b, 시스템은 A, Ax는 b를 A에 프로젝션한 A 내부의 최적화된 점(p, 프로젝션)이 된다.
여기서 x를 구하면 최적화된 방정식의 계수인 a,b가 나온다.
예) (x1,x2) -> y 이러한 함수가 y=ax1+bx2+c 이 모델로 만들어진다고 한다. 아래 점들에 최대한 근사한 평면으로 표현하라면 최적의 계수 a,b,c?
(0,0) -> 1
(2,2)->6
(1,4)->2
(4,6)->10
A=np.array([[0,0,1],[2,2,1],[1,4,1],[4,6,1]])
b=np.array([[1],[6],[2],[10]])
np.dot( np.dot( np.linalg.inv( np.dot(np.transpose(A), A)), np.transpose(A) ) , b)
Out[72]:
array([[ 3. ],
[-0.5],
[ 1. ]])
+ python source
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
A=np.array([[0,0,1],[2,2,1],[1,4,1],[4,6,1]])
b=np.array([[1],[6],[2],[10]])
x = np.dot( np.dot( np.linalg.inv( np.dot(np.transpose(A), A)), np.transpose(A) ) , b)
print('A=',A)
print('b=',b)
print('x=',x)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(A[:,0], A[:,1], b[:,0], marker='o', label='sample')
ax.set_xlabel('x1')
ax.set_ylabel('x2')
ax.set_zlabel('Y')
y = x[0]*A[:,0] + x[1]*A[:,1]+ x[2]
print('y=', y)
ax.scatter(A[:,0], A[:,1], y, marker='+', label='fitting')
# predict plane
x1=np.arange(0, 7, 0.2)
x2=np.arange(0, 7, 0.2)
x1,x2 = np.meshgrid(x1,x2)
Y = x[0]*x1 + x[1]*x2+ x[2]
ax.plot_surface(x1, x2, Y, alpha=0.2)
ax.legend()
plt.show()
파란점이 샘플 포인트이고 샘플 포인트에 최적화된 평면을 찾아 그 평면으로 다시 샘플포인트의 값을 추정하여 +로 표시하였음. (거의 일치)
'Math' 카테고리의 다른 글
integral csc(x) (0) | 2019.03.27 |
---|---|
최소제곱법 (0) | 2019.03.26 |
[미분] 미분 (0) | 2017.05.08 |
[적분] 곡선의 길이 계산2 (0) | 2017.05.08 |
[적분] 곡선의 길이 계산 (0) | 2016.09.06 |