Home [수학/선형대수] 행렬 고윳값분해, 특잇값분해
포스트
취소

[수학/선형대수] 행렬 고윳값분해, 특잇값분해

고윳값분해(고유분해)

  • 정방행렬 $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()

Screen Shot 2021-08-19 at 22 16 59

위 그림에서 초록색 화살표를 고유벡터 $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) # 고유벡터 행렬 (열벡터들이 고유벡터)

Screen Shot 2021-08-19 at 22 40 25

첫번째 리스트 안에 들어있는 값들이 고윳값들이다.

두번째 이차원 리스트 안에 들어있는 값들이 고유벡터다. 이차원 리스트 각 열 하나씩이 고유벡터다.

대각화 (고유분해 식의 변형)

정방행렬 $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 

Screen Shot 2021-08-19 at 23 01 39

대칭행렬의 고윳값 부호

정리 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
    

Screen Shot 2021-08-21 at 15 28 37

  • 축소했을 때
    1
    
    U2, np.diag(S2), VT2
    

    Screen Shot 2021-08-21 at 15 29 11

특잇값과 특이벡터 사이 관계

$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$ 일 때

$diag(\sigma_{1}, \sigma_{2}, … \sigma_{N},0 … ,0) = \Lambda$