[Math] 고유값 분해 (Eigen Value Decomposition)

고유값 분해(Eigen Value Decomposition)

  • 정방행렬 B에 대해$Bv = \lambda v$ 를 만족하는 고유값$\lambda$, 벡터$v$를 찾는 작업
  • 즉, 선형변환B에 의한 결과가 자기자신의 상수배가 되는, 0이 아닌 벡터(고유벡터)를 구하는 작업
    • 고유벡터 $v$: 선형변환 B에 대해 방향이 보존되는 방향벡터
      • 고유벡터간 orthogonal
    • 고유값 $\lambda$: 벡터 크기 스케일링 정도

대각화

  • 고유벡터행렬V로 행렬A를 표현

예제: 아래 행렬B를 고유값 분해 하시오

  • $Bv = \lambda v$ 증명하시오

1) np.linalg.eig

1
2
3
B = np.array([[2, 3],
[2, 1]])
B
array([[2, 3],
       [2, 1]])
1
w, v = np.linalg.eig(B)

2) eigen val & vec

1
2
# eigen values
w
array([ 4., -1.])
1
2
lambda1 = w[0]
lambda2 = w[1]
1
2
# eigen vectors: normalized
v
array([[ 0.83205029, -0.70710678],
       [ 0.5547002 ,  0.70710678]])

3) manually calculated eigen vec

1
2
3
4
v1 = np.array([[3],
[2]])
v2 = np.array([[-1],
[1]])
1
2
3
4
norm1 = np.sqrt(np.dot(v1.T,v1))
norm1 = np.squeeze(norm1)
norm2 = np.sqrt(np.dot(v2.T, v2))
norm2 = np.squeeze(norm2)
1
2
3
normal_v1 = v1 / norm1
normal_v2 = v2 / norm2
normal_v1
array([[0.83205029],
       [0.5547002 ]])
1
np.concatenate([normal_v1, normal_v2], axis=1)
array([[ 0.83205029, -0.70710678],
       [ 0.5547002 ,  0.70710678]])

4) $Bv = \lambda v$

1
2
3
# Bv = lambda v
np.dot(B, normal_v1) == lambda1 * normal_v1
np.dot(B, normal_v2) == lambda2 * normal_v2
array([[ True],
       [ True]])
< !-- add by yurixu 替换Google的jquery并且添加判断逻辑 -->