일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 네이버 뉴스
- 최소제곱법
- simple linear regression
- Omitted Variable Bias
- 사영
- 예제
- 회귀불연속설계
- causal inference
- 교란 변수
- 단순선형회귀
- 크롤링
- 누락편의
- Instrumental Variable
- rct
- 통계
- 인과 추론
- residuals
- 인과추론
- Python
- 머신러닝
- 선형대수
- 잔차의 성질
- LU분해
- 교란변수
- confounder
- least square estimation
- OVB
- backdoor adjustment
- Sharp RD
- HTML
- Today
- Total
Always awake,
Orthogonal 벡터 만들기 본문
orthogonal 개념
두 벡터가 "orthogonal하다"라는 것은 수직이라는 의미입니다.
두 벡터의 내적은 아래와 같으므로, orthogonal 한 두 벡터의 내적 값은 0 (cos(θ)=0)이 됩니다.
u⋅v=|u||v|cos(θ)
orthogonal한 벡터 만들기
하나의 벡터 u가 주어져 있고, 여기에 orthogonal하지 않은 벡터 v를 추가한다고 합시다
그리고 추가한 벡터 v로 기존에 있던 u와 orthogonal한 벡터를 만들고 싶다면 어떻게 하면 좋을까요?
이 두 개의 벡터 u, v를 이용하여 u에 orthogonal한 새로운 벡터를 만들 수 있습니다!
아래와 같이 2차원 평면에 u=[3,1]가 있고, 벡터 v=[1,2]를 추가하였습니다.
보이는 것처럼 두 벡터는 수직이 아니므로 orthogonal하지 않습니다

여기서 우리는 벡터 v에서 벡터 u로 수선의 발 v2을 내릴 것입니다. 아래와 같이 말이죠

그렇게 되면, 우리는 v2에서 v로 향하는 벡터를 구할 수 있게 되고 이는 기존에 존재한 벡터 u와 수직(orthogonal)이 됩니다. 해당 벡터를 v3라고 한다면, v3=(v−v2)와 같이 구할 수 있습니다.
그런데 여기서 u에 orthogonal한 벡터인 v3를 구하기 위해서는 v2가 필요합니다. 어떻게 구할 수 있을까요?
그림에서 보이는 것처럼 v2는 u와 방향이 같은 벡터이기 때문에 u의 길이를 늘리거나 줄인다면 v2를 만들 수 있습니다. 즉, 어떤 상수항 c를 u에 곱해주면 v2를 만들 수 있습니다 (c는 상수)
v2=cu

그렇다면 상수 c는 어떻게 구할 수 있을까요?
u와 방향이 같은 길이가 1인 unit 벡터 uunit을 구하고 그 벡터에 v2의 길이인 |v2|를 곱해주면 됩니다.
아래의 식을 보면 위에서 말씀드린 상수항 c는 |v2||u|가 되는 것이죠.
v2=|v2|uunit=|v2|u|u|=|v2||u|u
이제 마지막으로 |v2| 만 구하면 v2를 구할 수 있겠네요
답은 바로 위에서 보이는 직각 삼각형에 있습니다. 벡터 u와 v 사이의 각도를 θ라고 한다면, 삼각 함수 공식을 이용하여 |v2|를 구할 수 있습니다.
|v2|=|v|cos(θ)
자, 최종적으로 식을 대입해보면 아래와 같습니다
v2=|v2||u|u=|v|cos(θ)|u|u=cos(θ)|v||u|u
여기서 cos(θ)=u⋅v|u||v| 이고, |u|2=u⋅u 이므로, 아래와 같이 식이 변형됩니다.
v2=cos(θ)|v||u|u=u⋅v|u||v||v||u|u=u⋅v|u|2u=u⋅vu⋅uu

이제 진짜 진짜 마지막으로! 처음에 말씀 드린 v3=(v−v2)를 이용하여 u와 orthogonal한 벡터를 만들 수 있게 됩니다
v3=v−u⋅vu⋅uu
코드를 통한 예제
위의 두 벡터를 코드를 통해서 계산해보겠습니다
우선 numpy를 이용하여 위의 두 벡터 u, v를 만들어 줍니다.
import numpy as np
u = np.array([3,1])
v = np.array([1,2])
v에서 u에 수선의 발을 내린 v2를 만들어 줍니다. 위의 수식을 참고하세요 :)
# 새로 추가된 v를 u에 사영(수선의 발) 시키자
v2 = (u.dot(v) / u.dot(u)) * u
print('vector v2 :', v2)

그리고, v2와 v를 이용하여, u와 orthogonal한 벡터 v3를 만들어 줍시다
# u와 orthogonal한 벡터를 만들자
v3 = v - v2
print('vector v3 :', v3)

최종적으로 내적을 이용하여 v3와 u가 orthogonal한지 확인합니다.
내적 값이 0인 것으로 보아 orthogonal한 것을 알 수 있습니다 :)
# orthogonal한지 확인
print(u.dot(v3))

마치며
기존 벡터에 새로운 벡터를 추가할 때, orthogonal한 벡터를 만드는 방법에 대해 알아보았습니다
감사합니다.
▼ 글이 도움이 되셨다면 아래 클릭 한번 부탁드립니다 :) ▼
'선형 대수' 카테고리의 다른 글
correlation의 기하학적 의미 (0) | 2022.12.10 |
---|---|
Orthogonal 벡터 만들기 #2 (0) | 2022.03.07 |
Least Square & Normal Equation (0) | 2022.02.19 |
선형독립과 선형종속 (0) | 2022.02.18 |
회귀분석과 해의 존재성 (0) | 2022.02.14 |