고윳값분해(고유분해)
- 정방행렬 $A$의 고윳값과 고유벡터를 찾는 과정
- 오직 정방행렬만 고유분해 할 수 있다.
고유분해 식
$Av = \lambda v$
$A$는 정방행렬, $v$는 벡터, $\lambda$ 는 스칼라.
위 식 만족하는 $\lambda$를 ‘고윳값’, $v$ 벡터를 ‘고유벡터’라고 한다.
고유벡터
-
정의 : 정방행렬 $A$를 고유벡터에 곱해서 변환해도. 길이만 변하고 방향은 절대 안 바뀌는. 영벡터가 아닌 벡터
-
여기서 ‘방향이 같다’에는 정반대 방향도 포함된다.
# 고유벡터 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}$
넘파이로 고유분해 하기
np.linalg.eig(행렬)
-
고유벡터를 아이겐벡터라고도 한다. 명령 이름 $eig$는 거기서 따온 것이다.
-
고유분해 결과는 고유값들이 벡터 꼴로 나오고, 고유벡터들이 고유벡터행렬 꼴로 나온다.
-
고유벡터들은 고유벡터 행렬의 열 들이다.
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}$ 이다.
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. 아래쪽에 영행렬 -> 왼쪽특이벡터행렬 열 제거
2. 오른쪽에 영행렬 -> 오른쪽특이벡터행렬 행 제거
축소하든, 안 하든 결과는 같다($= A$).
파이썬으로 특잇값분해 하기
np.linalg.svd(행렬)
특잇값분해가 singular value decomposition 이기 때문에 명령 이름이 svd() 다.
- 결과물은 왼쪽 특이벡터행렬, 고윳값(스칼라값들), 오른쪽특이벡터 행렬의 전치행렬($V^{T}$) 가 나온다.
예)
데이터사이언스스쿨 연습문제 3.4.1
넘파이를 사용하여 다음 행렬을 특잇값분해 하라.
$B = [[3,2,2],[2,3,-2]]$
#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)
- 축소 안 했을 때
U, np.diag(S, -1)[1:, :], VT
- 축소했을 때
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$ 일 때