고윳값분해(고유분해)
- 정방행렬 $A$의 고윳값과 고유벡터를 찾는 과정
- 오직 정방행렬만 고유분해 할 수 있다.
고유분해 식
$Av = \lambda v$
$A$는 정방행렬, $v$는 벡터, $\lambda$ 는 스칼라.
위 식 만족하는 $\lambda$를 ‘고윳값’, $v$ 벡터를 ‘고유벡터’라고 한다.
고유벡터
정의 : 정방행렬 $A$를 고유벡터에 곱해서 변환해도. 길이만 변하고 방향은 절대 안 바뀌는. 영벡터가 아닌 벡터
여기서 ‘방향이 같다’에는 정반대 방향도 포함된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 고유벡터 v 변환
plt.xlim(-3,3)
plt.ylim(-3,3)
xx = np.linspace(0,1,10)
def line(x) :
return 2*x
r = line(xx)
color = ['red', 'blue', 'green', 'black']
for a,b in [(0,7),(2,3)] :
plt.annotate('', xy=[xx[b], r[b]], xytext=[0,0], arrowprops={'facecolor' : color[a]})
plt.annotate('', xy=[-xx[5], -r[5]], xytext=[0,0], arrowprops={'facecolor' : 'blue'})
plt.scatter(0,0,100, 'r')
plt.text(0.8, 1.3, '$Av$')
plt.text(0.2, 0.1, '$v$')
plt.text(-0.2, -0.7, '$Av$')
plt.title('고유벡터 $v$ 변환 예시')
plt.show()
위 그림에서 초록색 화살표를 고유벡터 $v$ 라고 하자. 고유벡터는 정방행렬 $A$를 곱해서 변환해도 위 그림처럼 길이만 변할 뿐, 방향 자체는 변하지 않는다.
- 고유벡터는 실수배 해도 모두 같은 고유벡터다. 따라서 정규화해서 길이 1짜리 단위벡터로 만들어 쓴다.
$cv = v$
$\frac{v}{\lVert v \rVert}$
- 고유벡터는 고윳값에 각각 대응된다. 따라서 고유벡터 수 = 고윳값 수 다.
고윳값
- 정의 : 고유벡터 $v$에 정방행렬 곱해서 변환한 벡터 $Av$ 와 원래 고유벡터 $v$ 의 크기 비율
- 변환하면서 변한 길이 만큼이 고윳값 $\lambda$ 이다.
특성방정식 : 행렬 A 고유분해 하기
$det(A-\lambda I) = 0$
위 식이 행렬 $A$를 고유분해 하는 특성방정식이다.
원래 고유분해 식 $Av = \lambda v$ 를 변형해서 구해낸 식이다.
$Av - \lambda v = 0$
$(A -\lambda I)v = 0$
두번째 식에서 고유벡터 $v$ 는 영벡터가 될 수 없다.
만약 $(A -\lambda I)$ 행렬이 역행렬이 존재한다면 $v$ 는 영벡터가 될 것이다.
따라서 $(A -\lambda I)$ 역행렬은 없어야 한다.
역행렬이 없기 때문에 위 행렬의 행렬식도 $0$ 이 되어야 한다.
여기 따라서 특성방정식 $det(A-\lambda I) = 0$ 가 나온다.
특성방정식 풀어서 고윳값 $\lambda$ 찾고, 고윳값에 대응되는 고유벡터를 찾으면 된다.
만약 특성방정식 풀었는데 해 $\lambda$ 가 중복값이라면, 이 $\lambda$ 를 중복고윳값 이라고 한다.
만약 고유벡터도 중복값이라면, 고유벡터를 ‘중복 고유벡터’라고 한다.
고윳값의 개수
정리 : 중복된 고윳값을 별개로 생각하고, 복소수 고윳값도 고려한다면 $n$ 차원 정방행렬은 항상 $n$ 개 고윳값을 갖는다.
고윳값과 대각합/행렬식
n차원 정방행렬은 항상 n개 고윳값 갖는다.
이 n개 고윳값 합은 정방행렬 대각합과 같다.
n개 고윳값 곱은 정방행렬 행렬식과 같다.
$tr(A) = \sum_{i}^{n} \lambda_{i}$
$det(A) = \prod_{i}^{n} \lambda_{i}$
넘파이로 고유분해 하기
1
np.linalg.eig(행렬)
고유벡터를 아이겐벡터라고도 한다. 명령 이름 $eig$는 거기서 따온 것이다.
고유분해 결과는 고유값들이 벡터 꼴로 나오고, 고유벡터들이 고유벡터행렬 꼴로 나온다.
고유벡터들은 고유벡터 행렬의 열 들이다.
1
2
3
4
A = np.array([[1,-2],[2,-3]])
ld, V = np.linalg.eig(A)
print(ld) # 고윳값들
print(V) # 고유벡터 행렬 (열벡터들이 고유벡터)
첫번째 리스트 안에 들어있는 값들이 고윳값들이다.
두번째 이차원 리스트 안에 들어있는 값들이 고유벡터다. 이차원 리스트 각 열 하나씩이 고유벡터다.
대각화 (고유분해 식의 변형)
정방행렬 $A$를 다음과 같이 나타내는 걸 ‘대각화’한다고 한다.
$A = V\Lambda V^{-1}$
$V$는 고유벡터를 열로 쌓아서 만든 ‘고유벡터 행렬’
$V \in R^{N*N}$
$\Lambda$ 는 대각행렬 대각성분들을 고윳값들로 채운 ‘고윳값 행렬’ 이다.
$\Lambda \in R^{N*N}$
대각화 가능
행렬 $A$가 ‘대각화 가능’ 이기 위해선 고유벡터행렬 $V$가 풀랭크여야 한다.
고유벡터 행렬 $V$는 정방행렬이었다. 정방행렬이 풀랭크이면 항상 역행렬 존재한다. 따라서 $V^{-1}$을 구할 수 있고, 위 대각화 식이 성립하게 된다.
고윳값과 역행렬
정리 : 대각화가능한 행렬 $A$ 의 고윳값 중에 $0$ 이 없다면, 행렬 $A$는 항상 역행렬 존재한다.
대칭행렬의 고유분해
정리 : 행렬 $A$가 실수로 이루어진 대칭행렬이면, 행렬 $A$는 실수 고윳값을 갖는다. 또 고유벡터 행렬은 정방정규직교 행렬이 된다.
- 정방정규직교 행렬의 역행렬은 자기자신의 전치행렬이다.
$V^{T}V = I$
$VV^{T} = I$
$V^{-1} = V^{T}$
정리 : 따라서 대칭행렬은 ‘항상 대각화 가능’ 이다.
$A = V\Lambda V^{T}$
대칭행렬을 랭크-1 행렬 합으로 분해
- $N$ 차원 대칭행렬은 랭크-1 행렬 $N$ 개 합으로 분해할 수 있다.
$A$
$= V\Lambda V^{T}$
$= \sum_{i}^{N}\lambda_{i} v_{i}v_{i}^{T}$
$= \sum_{i}^{N}\lambda_{i} A_{i}$
$A_{i}$ 는 임의의 랭크-1 행렬 $v_{i}v_{i}^{T}$ 이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
A = np.array([
[60,30,20],
[30,20,15],
[20,15,12]
])
ld, V = np.linalg.eig(A) #고유분해
l1 = ld[0]
l2 = ld[1]
l3 = ld[2]
v1 = V[:,0].reshape(3,1)
v2 = V[:,1].reshape(3,1)
v3 = V[:,2].reshape(3,1)
A2 = l1*v1@v1.T + l2*v2@v2.T+l3*v3@v3.T
A2
대칭행렬의 고윳값 부호
정리 1 : 대칭행렬이 양의 정부호이면 고윳값은 모두 양수다. 역도 성립한다.
정리 2 : 대칭행렬이 양의 준정부호이면 고윳값은 모두 0 또는 양수다. 역도 성립한다.
분산행렬
- $X^{T}X$
$XX^{T}$
- 정방행렬이고, 대칭행렬이다.
정리 : 분산행렬은 기본적으로 양의 준정부호이다. 고윳값은 모두 0 또는 양수다.
분산행렬의 역행렬
정리 : 행렬 X가 풀랭크이면, 분산행렬 $X^{T}X$ 는 항상 역행렬 존재한다.
두 가지 정리를 통해 위 정리를 설명할 수 있다.
첫째, 분산행렬은 대칭행렬이다.
대칭행렬은 항상 대각화 가능하다.
항상 대각화 가능한 행렬은 고윳값 중에 0이 없을 경우 항상 역행렬 존재했었다.
이번에 증명하고자 하는 정리에서, 행렬 $X$ 가 풀랭크라면 분산행렬은 양의 정부호이다.
(행렬 $X$의 열이 모두 선형독립 이므로 영벡터 아닌 모든 벡터 $v$ 에 대해
$Xv = \mu$ 에서
$\mu$ 가 영벡터 될 수 없다. 영벡터 아닌 벡터 $v$에 대해 $\mu$ 가 영벡터가 된다면 행렬 $X$ 열벡터들은 선형종속이 될 것이다.
따라서
$v^{T}(X^{T}X)v = (Xv)^{T}(Xv) = \mu^{T}\mu$ > $0$ 이 된다)
분산행렬이 양의 정부호라면, 고윳값들이 모두 양수이다(대칭행렬이므로).
대각화 가능한 대칭행렬인데 $0$ 인 고윳값이 없으므로 분산행렬 $X^{T}X$ 는 항상 역행렬 존재한다.
둘째,
행렬식이 $0$ 아니면 역행렬은 항상 존재한다.
행렬 $X$가 풀랭크일 때, 분산행렬은 양의 정부호였다. 대칭행렬이 양의 정부호이면 고윳값은 모두 양수다.
고윳값 곱은 행렬식과 같았다. 양수 고윳값을 모두 곱하면 행렬식은 절대로 $0$ 나오지 않는다. 행렬식이 항상 양수이므로, 분산행렬의 역행렬도 항상 존재한다.
고유분해 성질 요약 & 정리
$N$ 차원 정방행렬 $A$에 대해,
- 행렬 $A$는 $N$ 개 고윳값-고유벡터를 갖는다.
- 행렬의 대각합은 모든 고윳값 $\lambda$ 합과 같다.
- 행렬의 행렬식은 모든 고윳값 $\lambda$ 곱과 같다.
- 행렬 $A$ 가 대칭행렬이면, 실수 고윳값 $N$ 개를 가지며 고유벡터행렬은 정방 정규직교 행렬이다.
- 행렬 $A$ 가 대칭행렬이고 고윳값이 모두 양수이면, 행렬 $A$는 양의 정부호다. 역도 성립한다.
- 행렬 $A$ 가 어떤 행렬 $X$의 분산행렬 $X^{T}X$ 이면 양의 준정부호로, $0$ 또는 양의 고윳값을 갖는다.
- 분산행렬 $X^{T}X$ 의 행렬 $X$가 풀랭크이면, 분산행렬은 역행렬이 항상 존재한다.
특잇값분해(특이분해)
- 모든 행렬에 대해 특잇값분해 할 수 있다.
고유분해는 정방행렬에만 가능했다.
특잇값분해 식
$A = U\Sigma V^{T}$
- A는 모든 행렬
$A \in R^{N*M}$
- U는 왼쪽 특이벡터행렬, 열벡터들이 특이벡터들이다. 또 정방 정규직교행렬이다.
$U \in R^{N*N}$
- $\Sigma$ 는 특잇값 행렬, 대각성분에 양수인 특잇값들로 구성된 대각행렬이다.
대각성분은 왼쪽 상단부터 오른쪽 하단까지 크기순 배치된다.
특잇값행렬은 본래 행렬 $A$와 크기가 같다.
$\Sigma \in R^{N*M}$
- V는 오른쪽 특이벡터행렬, 열벡터들이 특이벡터들이다. 정방 정규직교행렬이다.
$V^{T}$ 에서는 행벡터들이 오른쪽 특이벡터들이다.
$V^{T} \in R^{M*M}$
특잇값 개수
$N$(특잇값 수) $=$ $min(N,M)$
행렬 $A$의 행 수가 $N$, 열 수가 $M$ 일 때, 특잇값 개수는 $N,M$ 중 더 작은 값과 같다.
예) $A \in R^{2*3}$ 인 경우 : 특잇값 2개 갖는다.
특잇값분해 축소형
특잇값행렬은 원래 행렬 $A$와 사이즈가 똑같다. $(N*M)$
만약 특잇값행렬 사이즈가 $3*2$ 인데 특잇값 수는 $2$ 인 경우,
대각행렬인 특잇값행렬은 다음과 같아진다.
$[[s1, 0],[0, s2],[0,0]]$
한편 특잇값행렬 사이즈가 $2*3$ 인데 특잇값 수가 2인 경우, 특잇값행렬은 다음과 같다.
$[[s1,0,0],[0, s2,0]]$
이렇게 특잇값행렬 행, 열 수가 다를 경우, 행렬 아래쪽 또는 오른쪽에 영벡터 부분이 생긴다.
이 영벡터 부분은 계산에서 있으나 없으나 결과가 같기 때문에 생략할 수 있다.
특잇값분해 과정에서 이렇게 특잇값행렬의 영벡터 부분을 ‘생략’하는 것을 ‘특잇값분해 축소형’ 이라고 한다.
특잇값행렬 아래쪽 영으로 구성된 행벡터 1개를 생략할 때, 왼쪽 특이벡터행렬에서 가장 오른쪽 열벡터 1개도 함께 생략한다.
특잇값행렬 오른쪽 영으로 구성된 행벡터 중 1개를 생략할 때, 오른쪽 특이벡터행렬에서 가장 아래쪽 행벡터 1개도 함께 생략한다.
더 간략하게 다시 정리하면 다음과 같다.
1. 아래쪽에 영행렬 $\rightarrow$ 왼쪽특이벡터행렬 열 제거
2. 오른쪽에 영행렬 $\rightarrow$ 오른쪽특이벡터행렬 행 제거
축소하든, 안 하든 결과는 같다($= A$).
파이썬으로 특잇값분해 하기
1
np.linalg.svd(행렬)
특잇값분해가 singular value decomposition 이기 때문에 명령 이름이 svd() 다.
- 결과물은 왼쪽 특이벡터행렬, 고윳값(스칼라값들), 오른쪽특이벡터 행렬의 전치행렬($V^{T}$) 가 나온다.
예)
데이터사이언스스쿨 연습문제 3.4.1
넘파이를 사용하여 다음 행렬을 특잇값분해 하라.
$B = [[3,2,2],[2,3,-2]]$
1
2
3
4
5
#1.
B = np.array([[3,2,2],[2,3,-2]])
U, S, VT = np.linalg.svd(B)
U2, S2, VT2 = np.linalg.svd(B, full_matrices=False)
- 축소 안 했을 때
1
U, np.diag(S, -1)[1:, :], VT
- 축소했을 때
1
U2, np.diag(S2), VT2
특잇값과 특이벡터 사이 관계
$Av_{i} = \sigma_{i}\mu_{i}$
성립한다.
- 특잇값 1개 당 좌우 특이벡터가 하나씩 대응된다.
특잇값분해-고윳값분해 사이 관계
- 특잇값분해 결과를 고윳값분해 결과에 대응시킬 수 있다.
분산행렬 $A^{T}A$ 가 있다고 하자.
행렬 $A$ 특잇값분해 결과를 $A^{T}A$ 에 대응하면 다음과 같다.
$A^{T}A = (U\Sigma V^{T})^{T}U\Sigma V^{T}$
$= V\Sigma^{T}U^{T}U\Sigma V^{T}$
$=V\Sigma^{T}\Sigma V^{T}$
한편 분산행렬 $A^{T}A$ 는 정방대칭행렬이므로 고유분해 가능하다.
$A^{T}A = V\Lambda V^{T}$
결국
$V(\Sigma^{T}\Sigma) V^{T} = V\Lambda V^{T}$ 이다.
- 오른쪽특이벡터행렬 $V$는 고유벡터행렬 $V$와 같다.
- 특잇값 제곱(과 0) 은 고윳값과 같다.
$\Lambda \in R^{M*M}$
$N$ > $M$ 일 때
$diag(\sigma_{1}, \sigma_{2}, … \sigma_{M}) = \Lambda$
$N$ < $M$ 일 때