혼자 공부/선형대수학

직교벡터 분해

왕초보코딩러 2025. 3. 5. 17:28
728x90

https://product.kyobobook.co.kr/detail/S000209345747?utm_source=google&utm_medium=cpc&utm_campaign=googleSearch&gt_network=g&gt_keyword=&gt_target_id=aud-901091942354:dsa-608444978378&gt_campaign_id=9979905549&gt_adgroup_id=132556570510&gad_source=1

개발자를 위한 실전 선형대수학(파이썬 3.10 버전 대응, 구글 코랩 실습 가능) | 마이크 X 코헨 - 교

개발자를 위한 실전 선형대수학(파이썬 3.10 버전 대응, 구글 코랩 실습 가능) | 복잡한 증명과 수식 없이 파이썬을 이용해 직관적으로 배우는 선형대수학 * 연습문제 + 해답 + 해설 강의, 무료 샘

product.kyobobook.co.kr

 


하나의 벡터를 두 개의 벡터로 분해

벡터 a와 b
거리가 최소가 되도록 벡터 b를 벡터 a에 투영 = 직각이 되도록 내리면 된다
βa와 (b- βa)의 내적은 0(직교하는 벡터의 내적은 0)
즉 a와 (b-βa)의 내적은 0
직교 투영법: 점을 최소 거리로 투영하는 공식
 

β= a⋅a / a⋅b

 

# 벡터 정의
a = np.array([2, 0])
b = np.array([1, 3])

# 벡터 a에 대한 b의 정사영 계산
beta = (np.dot(a, b) / np.dot(a, a))
proj_b_on_a =  beta * a # a에 스칼라 값 beta를 곱해서 a 확장/축소

# 그래프 설정
plt.xlim(-1, 3)
plt.ylim(-1, 4)

# 축 그리기
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)

# 벡터 그리기
plt.quiver(0, 0, a[0], a[1], angles='xy', scale_units='xy', scale=1, color='blue')
plt.quiver(0, 0, b[0], b[1], angles='xy', scale_units='xy', scale=1, color='red')
plt.scatter(proj_a_on_b[0], proj_a_on_b[1], color='black')

# 정사영 점선 추가
plt.plot([b[0], proj_a_on_b[0]], [b[1], proj_a_on_b[1]], 'k--', alpha=0.7)

# 벡터 라벨 추가
plt.text(b[0], b[1], r'$\vec{b}$', fontsize=12, verticalalignment='bottom', horizontalalignment='left')
plt.text(a[0], a[1], r'$\vec{a}$', fontsize=12, verticalalignment='top', horizontalalignment='right')
plt.text(proj_a_on_b[0], proj_a_on_b[1], r'$\beta$', fontsize=12, verticalalignment='top', horizontalalignment='right')
plt.text((b[0]+proj_a_on_b[0])/2, (b[1]+proj_a_on_b[1])/2, r'$(b-\beta a)$', fontsize=12, verticalalignment='top', horizontalalignment='left')

# 격자 및 스케일 설정
plt.grid(True, linestyle='dotted', linewidth=0.5)
plt.gca().set_aspect('equal')

plt.show()

 
 


직교벡터 분해하기
목표 벡터와 기준벡터가 필요
 
목표벡터: 두 개의 다른 벡터로 분해될 벡터
분해될 두 개의 벡터
- 기준벡터와 직교
- 기준벡터와 평행
 
기준벡터와 직교한 벡터 + 기준벡터와 평행한 벡터 = 목표벡터

t = np.random.randn(2) # 목표벡터
r = np.random.randn(2) # 기준벡터

beta = np.dot(t,r) / np.dot(r,r)
t_para = beta*r # 평행 parallel
t_perp = t - t_para # 수직 perpendicular
beta, t_para, t_perp

# 벡터 그리기
plt.quiver(0, 0, t[0], t[1], angles='xy', scale_units='xy', scale=1, color='blue', label='목표벡터')
plt.quiver(0, 0, r[0], r[1], angles='xy', scale_units='xy', scale=1, color='red', label='기준벡터')
plt.plot([0,t_para[0]], [0,t_para[1]], 'k--', label='기준벡터와 평행')
plt.plot([0,t_perp[0]], [0,t_perp[1]], 'k:', label='기준벡터와 수직')

# plt.scatter(t_para[0]+t_perp[0], t_para[1]+t_perp[1])

plt.axis('equal')
plt.legend()

 

 

'혼자 공부 > 선형대수학' 카테고리의 다른 글

상관관계와 코사인 유사도  (0) 2025.03.18
벡터2  (0) 2025.03.07
벡터1  (0) 2025.03.03