고유값 분해(Eigen Value Decomposition)
- 정방행렬 B에 대해Bv=λv 를 만족하는 고유값λ, 벡터v를 찾는 작업
- 즉, 선형변환B에 의한 결과가 자기자신의 상수배가 되는, 0이 아닌 벡터(고유벡터)를 구하는 작업
- 고유벡터 v: 선형변환 B에 대해 방향이 보존되는 방향벡터
- 고유값 λ: 벡터 크기 스케일링 정도
대각화
- 고유벡터행렬V로 행렬A를 표현A=VΛVT
예제: 아래 행렬B를 고유값 분해 하시오
B=[2321]
1) np.linalg.eig
1 2 3
| B = np.array([[2, 3], [2, 1]]) B
|
array([[2, 3],
[2, 1]])
2) eigen val & vec
array([ 4., -1.])
1 2
| lambda1 = w[0] lambda2 = w[1]
|
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=λv
1 2 3
| np.dot(B, normal_v1) == lambda1 * normal_v1 np.dot(B, normal_v2) == lambda2 * normal_v2
|
array([[ True],
[ True]])