목록으로

Chapter 5: 직교성과 정규화

진행률: 5 / 8
예상 시간: 25분난이도: 중급

직교성과 정규화

학습 목표

  • 직교와 정규직교의 개념 이해
  • 그람-슈미트 과정 마스터
  • QR 분해와 최소제곱법 응용

직교성의 개념

직교 벡터

u·v = 0 ⟺ u ⊥ v

두 벡터의 내적이 0일 때 직교

정규직교 벡터

u·v = δᵢⱼ (크로네커 델타)

직교하면서 크기가 1인 벡터들

그람-슈미트 과정

선형독립인 벡터들을 정규직교 벡터로 변환하는 알고리즘

  1. 1

    첫 번째 벡터 정규화

    u₁ = v₁ / ||v₁||

  2. 2

    직교 성분 추출

    w₂ = v₂ - (v₂·u₁)u₁

  3. 3

    정규화

    u₂ = w₂ / ||w₂||

  4. 4

    반복

    모든 벡터에 대해 과정 반복

QR 분해

A = QR

  • • Q: 정규직교 행렬 (직교 열벡터)
  • • R: 상삼각 행렬

응용 1: 선형시스템

Ax = b → QRx = b → Rx = Q^Tb

응용 2: 고유값

QR 알고리즘으로 고유값 계산

최소제곱법 (Least Squares)

Ax = b가 해가 없을 때, ||Ax - b||²를 최소화하는 x 찾기

정규방정식

A^TAx = A^Tb

해: x = (A^TA)⁻¹A^Tb

Python 구현

import numpy as np

def gram_schmidt(V):
    """그람-슈미트 과정 구현"""
    n = V.shape[1]
    U = np.zeros_like(V, dtype=float)
    
    for i in range(n):
        # i번째 벡터 가져오기
        u = V[:, i].copy()
        
        # 이전 직교 벡터들에 대한 투영 제거
        for j in range(i):
            u -= np.dot(V[:, i], U[:, j]) * U[:, j]
        
        # 정규화
        U[:, i] = u / np.linalg.norm(u)
    
    return U

# QR 분해
def qr_decomposition(A):
    """QR 분해 구현"""
    Q = gram_schmidt(A)
    R = Q.T @ A
    return Q, R

# 최소제곱법
def least_squares(A, b):
    """최소제곱 해 계산"""
    # 방법 1: 정규방정식
    x1 = np.linalg.inv(A.T @ A) @ A.T @ b
    
    # 방법 2: QR 분해 사용
    Q, R = np.linalg.qr(A)
    x2 = np.linalg.solve(R, Q.T @ b)
    
    return x1, x2

# 예제
A = np.array([[1, 0], [1, 1], [1, 2]])
b = np.array([1, 2, 2])

x1, x2 = least_squares(A, b)
print(f"정규방정식 해: {x1}")
print(f"QR 분해 해: {x2}")
print(f"잔차: {np.linalg.norm(A @ x1 - b):.4f}")