AR model(자기회귀모델)과 같이 $x_{t}$가 $x_{t-1}$에 영향을 받을 때(=$x_{t}$가 $x_{t-1}$입력값으로 할 때), 간혹 이런 모델은 폭주하거나, 안정적인 값을 지니게 된다. 이 폭주와 안정에 대한 정의는 다음과 같다.

 

1) 폭주: 어떤 초깃값 x(0)에서 시작해도, x(t)가 유한의 범위에 머무른다. 즉, t가 아무리커져도 모델f(t)의 상(image)가 유한하다는 것이다(=무한대로 안간다)

2) 안정: 어느 c점에서 안정이란 'c의 매우 가까운 곳에서 시작하면 언제까지나 그 점 가까이에 머무른다"

일반적으로 쓰는 수학용어는 아니고, 책 "프로그래머를 위한 선형대수"에 나오는 용어인데 쉽게 설명되어 참조한다.

https://book.naver.com/bookdb/book_detail.nhn?bid=11761716 

 

프로그래머를 위한 선형대수

행렬식을 계산할 수는 있지만, 행렬식의 의미는 모른다? 손으로 계산하든 컴퓨터로 계산하든 식의 의미를 이해하지 못하면 무슨 소용이 있을까요? 선형대수를 푸는 방법이 아니라 ‘왜 이런 결

book.naver.com

 

 

예제)

1차원의 경우: $x(t)=7x(t-1)$.  이 식은 x(t)가 x(t-1)과 7x만큼 회귀하므로, 이를 다시 대입해보면... $x(t)=7^{t}x())$이다. 따라서, t가 무한히 커질경우에 x(t)도 무한히 커져서 발산한다.

 

대각행렬의 경우: $x(t)=\begin{bmatrix}
5 &  0& 0\\ 
0 &  -3& 0\\ 
0 &  0& 0.8
\end{bmatrix} x(t-1) = x(t)=\begin{bmatrix}
5^{t} &  0& 0\\ 
0 &  -3^{t}& 0\\ 
0 &  0& 0.8^{t}
\end{bmatrix} x(0)

$

이 행렬의 경우는 다음과 같이 다시, 일반화해서 쓰면 발산함을 알 수 있다. 특정 $x_{1},x_{2},x_{3}$중 하나라도 발산하면 해당 모델은 발산한다.

즉, 일반화 해서 얘기하면, $x(t)=\begin{bmatrix}
a^{t} &  & \\ 
 &  & \\ 
 &  &a_{n}^{t} 
\end{bmatrix}x(0)$가 에서 원소가 하나라도 1보다 크면 발산한다고 할 수 있다.

 

변수변환


이를 행열로 연산하면 다음과 같다. 주어진 식은 $x(t)=Ax(t-1)$과 같을 때, 이를 행렬로만 조작해보자. 예시를 위해 다음과 같은 행열이 주어졌다고 가정해본다.

 

예시, 행렬 x(t-)=Ax(t-1)

 

우선, $y(t)=Cx(t), C=\begin{bmatrix}
1 & 1\\ 
1 & -1
\end{bmatrix}$으로 두고,각 x(t)와 y(t)은 종벡터라고 생각하자.

그러면, 위의연산과 동일하게 작업하면, 아래의 y의 대한 행렬식으로 변환할 수 있다. 

여기서, Y(t)을 x(t)에 대해서 정리하면 다음과 같다.

핵심은 1) C행렬을 이용하여 y=Cx을 통해서 y에 대한 식으로 바꾼다. 2) y(t)=y(t-1)꼴로 만든다음에, y=Cx을 이용하여 x에대해서 다시 전개한다.

$y(t)=Cx(t-1)$ 을 다음과 같이 $x(t-1)=C^{-1}y(t)$라고 써볼 수 있다. $x(t)=Py(t)$라고 임의의 P을 C의 역행열이라고하자. 그러면, $P^{-1}x(t)=y(t)$이 된다. 

 

$y(t)=P^{-1}x(t)=P^{-1}(Ax(t-1)=P^{-1}Ax(t-1)=P^{-1}APy(t-1)$

 

즉, $x(t)=Ax(t-1)$라는 수식이 $y(t)=P^{-1}APy(t-1)$으로 변경된다.  이때 $P^{-1}AP=K$라고하고, K가 대각행열이면, 간단하게 $y(t)=K^{t}y(0)$으로 수식이 바뀐다. 

 

간단하게, x에 대해서도 변경해보면 $x(t)=Py(t)$이므로, 위의 식에 대입해 계산해보면, $x(t)=PKP^{-1}x(0)$으로도 바뀐다. 이를 대각화라고 한다.

 

 

고윳값과 고유벡터


고유분해는 행렬 $A$의 고유기저(자체 기저)에 대해 A를 표현하는 기저변환 연산이다. 가령 행렬의 고유분해는 다음의 세 행렬을 곱한것이다.

예를들어 A행열을 77번 곱해야하는 연산이 있으면 직접 For loop으로 여러번 계산할 것이 아니라, $PL^{77}P$을 구하면 된다는 것이, 이 고유분해의 이점이다. 가령, 임의의 행렬 A가 주어지면, 아래와 같이 연산할 수 있다. 아래의 행렬에서 _lambda만 77번구하면 된다. 

import numpy as np

A = np.array([[5, 1], [3, 3]])
eig_val, eig_vec = np.linalg.eig(A)  

_lambda = np.identity(2)
for i in range(2):
    _lambda[i,i] = eig_val[i]

eig_vec @ _lambda*77 @ np.linalg.inv(eig_vec)  # A77 = QLQ

위의 사례와 같이, 일단 A을 고유기저로 표현하면 A의 거드벶곱을 계산할 때, 고유값의 거듭제곱을 계산하면 된다는 것이 핵심이다. 이렇게 계산하는게, 행열을 직접 77번 계산하는것보다 훨씬 간단하다.

x: 고유벡터, lambda: 고유값

위의 고유벡터와 고유값의 의미는 다음과 같다. matrix A는 어느 좌표평면에서의 변환(늘리거나 줄이거나)하는 사상이라고 했다. A을 통해 매핑된 벡터가 있다고 하자. Ax의 의미는 x을 A방향으로 늘리거나 줄이거나하는 시도이다. 그런데, 늘리거나 줄이거나한 것이 원래 x방향대로는 그대로있고, lambda만큼의 상수배한거에불과하다는 뜻이다. 바꿔말하면, 고유벡터는 A가 가지고있는 변환과 같은 방향을 가진 벡터이고, 길이는 lambda만큼 늘리는 작업에 불과한것이다. 그래서, A는 x방향으로 매핑하는 작업을 lambda만큼 늘리는 작업이라고 쉽게 기하학적으로 설명할 수 있다. 

수학적 표현 기하학적 표현
행렬 A의 연산 위또는 옆으로 늘림
행렬 A의 고유벡터 A로 변환하는 작업과 같은 방향
행렬 A의 고유값 늘리는 작업을 할경우에 몇배로 늘리겠는가?

고유벡터 기하학적 의미는 'A을 곱해도, 신축만 되고,방향은 변하지 않는다'

고유값 의미는 신축율(몇 배가 늘어나는가)을 의미한다.

 

정의는 다음과 같다.

  • A: 정방 행열이어야함.
  • eig(A): A의 고윳값의 나열이다. 가령 $\lambda_{1}, ..., \lambda_{n}$. 일부 고유값은 중복될 수 있다.
  • $\Lambda$: 대각선상에 A의 고유값이 있는 형태
  • Q: 열이 A의 고유벡터인행열. 
  • $A=Q\Lambda Q^{-1}$: 행렬 A의 고유분해
  • $\Lambda =Q^{-1}AQ$: 행렬 A의 대각화

import numpy as np

A = np.array([[5, 1], [3, 3]])

eig_val, eig_vec = np.linalg.eig(A)
eig_val  # 6, 2

# This means that the eigenvector corresponding to λ=6 is:[0.70710678 0.70710678]
print(eig_val[0], eig_vec[:, 0])  
A @ eig_vec[:, 0] == eig_val[0] * eig_vec[:, 0]  # True, True

 

 

 

상삼각행렬이나, 하삼각행렬에서 대각성분이 고윳값임. 이는 $Ap=\lambda p$을 구하려고할때, 후대치(back substitute)로 계산하다보니, 고윳값1,2,3에 해당하는 세번쨰 고유값은 무조건8($8p_{3}=\lambda p_{3}$, $p_{3}=0$일 경우에는 두번째 고윳값이 성립이안됨. $3p_{2}=2p_{2}$)일거고, 두번째 고유값도 따라서 3이며, 첫번쨰 고유값도 여김없이 5에 해당된다.  

예제 1) 대각행열만 있는 경우는 바로 5,3,8이 고유값

A = np.array([[5, 0, 0], [0, 3, 0], [0, 0, 8]])
print(A)
print(np.linalg.eigvals(A))

[[5 0 0]
 [0 3 0]
 [0 0 8]]

[5. 3. 8.]

예제 2) 상삼각행열이 있는 경우에도 대각행열이 바로 고유값

A = np.array([[3, -1, 1],
              [0, 2, 1],
              [0, 0, 3]])

np.linalg.eigvals(A)  # array([3., 2., 3.])

예제 3) 고유값이 중복인경우. 고유값이 중복인경우는 중복된 고유값만큼 , 중복된 값에 상응하는 고유벡터는 선형독립어야한다.

A = np.array([[3, -1, 1],
              [0, 2, 1],
              [0, 0, 3]])

eigvals = np.linalg.eigvals(A)  # array([3., 2., 3.])


eig_vec = array([[1.        , 0.70710678, 0.        ],
                 [0.        , 0.70710678, 0.70710678],
                 [0.        , 0.        , 0.70710678]]))

=> 어느 고유값이라도 중복수와 같은 개수의 선형독립인 고유벡터가 있으면, 합계 n개의 선형독립인 고유벡터가 있는 것이고, 그것을 나열하기만하면 정방행열 P는 정칙이 됨. 그러면 대각화가 가능

예제 4) 중복고유값 + 고유벡터가 독립이 아닌경우

A = np.array([[3, -1, 1],
              [0, 2, 0],
              [0, 0, 3]])  # 상삼각행열이므로, 고유값이 3, 2, 3으로 정해져있다.

eig_vals, eig_vecs = np.linalg.eig(A)
eig_vals  #[3, 2, 3]
### array([3., 2., 3.])

eig_vecs 

# 1번열과 3번열이 독립이 아님. -> QAQ^-1 형식으로 대각화가 불가능함
### array([[ 1.00000000e+00,  7.07106781e-01, -1.00000000e+00]
###       [ 0.00000000e+00,  7.07106781e-01,  0.00000000e+00],
###       [ 0.00000000e+00,  0.00000000e+00,  6.66133815e-16]])  #0.6e-16: 사실상 0임

 

A와 같은 크기의 정칙행렬 S에 대해서 $S^{-1}p$는 $S^{-1}AS$의 고유벡터.

=> $(S^{-1}AS)(S^{-1}p)=\lambda (S^{-1}p)$ 의 식에서 S의 역행열의 연산만 추가된 경우이다.

 

$\lambda x_{1}, ..., \lambda x_{n}$가 A의 고유값이고, $p_{1},...p_{n}$이 고유벡터일때, 만약, 고유값 $\lambda x_{1}, ..., \lambda x_{n}$가 다 다르면, A는 선형독립이다.

 

 

 

Note

1. 실수로 이루어진 행열A라도, 고유값과 고유벡터는 복소수 인경우가 있음.

import matplotlib.pyplot as plt

A = np.array([[0, -1], [1,0]])
x = np.array([0.5, 0.5])

ax = plt.axes() 
plt.arrow(0, 0, *x, head_width=0.05, head_length=0.1, fc='k', ec='k')   # 원래벡터
plt.xlim(-1,1)
plt.ylim(-1,1)

plt.arrow(0, 0, *x@A, head_width=0.05, head_length=0.1, fc='r', ec='r')  # A를 매핑한 벡터
plt.show()

검은색벡터를 시계방향으로 회전시키는 A가 있다. 이 회전변환에 대해서 무조건 변하지 않는 벡터가 있을까? 실수영역에서는 없다.

np.linalg.eig(A)

# 복소수 형태의 고유벡터가 있다.
# (array([0.+1.j, 0.-1.j]),
# array([[0.70710678+0.j        , 0.70710678-0.j        ],
#        [0.        -0.70710678j, 0.        +0.70710678j]]))

 

d

반응형

+ Recent posts