어떤 메트릭스 M이 Positive definite이라고하면, 흔히 PDM(Positive Definite Matrix)이라고 한다. 이러한 matrix은 아래의 조건을 만족하는 경우를 의미한다. 흔히 이 경우를 "M > 0"와 같이 수학적인 표기도 한다(행렬 A의 원소가 모두 0보다 크다는 의미가 아니다). PDM은 어떠한 함수를 메트릭스 M으로 표현했을때, 함수가 극소점을 갖는다는 것을 의미한다.
조건은 다음과 같다. 메트릭스 M이 1) 실수를 원소로하고, 2) 대칭형인 매트릭스(Symmetric matrix)이며, 3) 실수로 이뤄진 벡터 z에 대해서도 $z^{T}Mz$연산을 하더라도 양수가 나오는 메트릭스를 의미함.
즉, $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번 계산하는것보다 훨씬 간단하다.
위의 고유벡터와 고유값의 의미는 다음과 같다. 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에 해당된다.
대부분의 행렬A는 행렬을 일단 L(하삼각행렬 + 대각행렬은 1)과 U(상삼각행렬)로 분해가 된다. 분해를 왜하냐고 묻는다면, 일단 분해하고나면, A의 특성을 구하는데, 여러모로 행렬연산이 편해진다. 예를 들어, LU을 분해하고나면 det(LU)=det(L)det(U)로 바로 계산할수도있고, 일차방정식, 역행렬도 구할 수 있다.
L(하삼각행렬): 다음의 꼴과 같이 하삼각행렬만 0이 아닌 값이 있고, 대각행렬은 모두 0이어야 한다. 유사하게 U(상삼각행렬)은 위의 삼각행렬을 제외하고 모두 0이어야한다. 다만 L의 대각행렬이 1이기 때문에, 상삼각행렬은 1일 필요는 없다. 대각행열까지를 포함한다. Python의 Numpy은 Tri+(l, u)을 통해 이를 구현하고있다. np.tril은 하삼각행렬을 만들어주는 함수이고, np.triu은 상삼각행렬을 만들어준다.
import numpy as np
# 하삼각행렬
L = np.tril([[1,2,3],
[4,5,6],
[7,8,9]], k=-1)
I = np.identity(L.shape[0])
L = L + I
print(L)
[[1. 0. 0.]
[4. 1. 0.]
[7. 8. 1.]]
LU 분해는 numpy로 직접구하거나 scipy에 지원하는 lu 분해를 이용한다. scipy은 p matrix을 주는데, 행렬을 순서를 변경하기위한 행렬이다. LU분해를 할 때, L의 대각행렬이 아무리 연산하려고해도 0이어서, 다음 하삼각행렬을 구할 수 없을때, 피봇팅(pivotting)해주게되는데, scipy.linalg.lu 은 이 피봇팅한것을 원복할 때 쓰는 P을 가지고있다. 따라서, $A=PLU$으로 연산할 수 있고, 내부적으로 연산한 L, U을 반환해주기도 한다 (permute_l=True: Perform the multiplication P*L). 보통은 이 P을 치환행렬(Pivoting 을 위한 행렬)이라고한다.
# scipy을 이용하는 방법
from scipy.linalg import lu as lu_decompose
mat = np.array([[1,2,3],
[2,6,4],
[8,9,1]])
L, U = lu_decompose(mat, permute_l=True) # p matrix을 안받으려면 True로 설정
def lu_decompose(mat):
rows, columns = mat.shape
s = min(rows, columns) # to determine s: (row by s) @ (s by colunns)
for k in range(s):
x = 1 / mat[k,k]
for i in range(k+1, rows):
mat[i,k] = mat[i,k] * x
for i in range(k+1, rows):
for j in range(k+1, columns):
mat[i,j] = mat[i,j] - mat[i,k] * mat[k,j]
L = np.tril(mat, k=-1) + np.identity(rows)
U = np.triu(mat, k=0)
return L, U
mat = np.array([[1,2,3],
[2,6,4],
[8,9,1]])
L, U = lu_decompose(mat)
$Ax=y$ 이었으므로, $LUx=y$라고 쓸 수있다. 따라서, $x$에 $u$을 곱하고, $L$을 다시 곱하면, y가 된다 라는 말이다. 반대로, x을 찾기위해서는 y가 되는 Lz을 구하고, z가 되는 Ux의 x을 구하면된다.
$Ax=b$의 식을 구하는 것을 보면, x은 해를 구하는 방법이다. 한편, $Ax=I$으로 $b$을 $I$으로 바꾸면, A을 역행렬을 구하는 작업이다.
우선A의 LU을 구했다고치자. 다음의 전개가 가능하다.
$LUx=I$
$Ly=I, where Ux=y$
따라서, $Ly=I$을 먼저 구한 다음에 순차적으로 x까지구하면된다. 문제는 이러한 방법이 왜 편리하냐를 의미하는 것인데, 이는 전방대치(forward substitute)와 후방대치(backward substitute)을 쓸 수 있어서 그렇다. 아래와 같이 전방치(forward substitution)방법으로 구하는 방법은 하삼각행렬만 숫자가 0이 아니고, 나머지는 0이기에, 직관적으로 x1은 5/3임을 알 수 있다. 이를 구했기에, 2행..4행까지 바로 다 구할 수 있다. 그렇기에 편리하다는 의미이다.
역문제: 역문제란 $y=ax$와 같이 $y$을 알고, 원인 $x$을 추정하는 형태의 문제를 역문제라고함.
순문제: 순문제는 역문제와 반대로 x에서 y을 예측하는 문제를 순문제라고 함.
정칙성과 행렬
정칙행렬(Nonsingular matrix, regular matrix): 정칙행렬은 역행렬이 존재하는 정방행렬을 말한다.
특이행렬(Singular matrix): 정칙행렬과 반대로 역행렬이 존재하지 않는 경우를 말한다.
연립일차방정식의 해법
$y=ax$와 같이 연립방정식의 해가 있는 경우는 A을 구할 수 있다. 즉, A가 정칙행렬인 경우에는 x을 구할 수 있다는 말이다.
연립일차방정식의 풀이는 정칙행렬인 경우 1) 변수소거법, 2)가우스 요르단 소거법, 3)역행렬을 계산으로 풀 수 있다.
1) 변수 소거법의 핵심은 $(I|S)(\frac{x}{-1})=o$ 을 만드는 것이다. 예를 들어, $A=\begin{bmatrix} 2 & 3& 3\\ 3 & 4& 2\\ -2 & -2& 3 \end{bmatrix}$, $y=\begin{bmatrix} 9\\ 9\\ 2 \end{bmatrix}$ 인 경우
4. 대각행렬: 정방행렬이지만, 대각행렬만 0이 아니고 모두 0인경우 $\begin{bmatrix} 3 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 5 \end{bmatrix}$
5. 역행렬= 역사상. 정의: 정방행렬$A$에 대해 그 역사상에 대응하는 행렬을 A의 역행렬이라고 함. 기로호는 $A^{-1}$으로 쓰고, 어떠한 $x$을 가져와도 $Ax=y$ 또는 $A^{-1}y=x$이다. 그리고, 이 역행렬은 있을 수도 없을 수도 있음.
6. 행렬의 곱셈 트릭
$y=A\textbf{x}+b$ 을 행렬의 곱으로만 표시할 수 있을까? 정답은 Y이다. +b와 같이 상수항의 덧셈이 있을 땐, $\tilde{y} = \tilde{A}\tilde{x}$ 으로 표기하고, $\tilde{A}=A+o^{T}$, $\tilde{x}=x+1$ 으로 표기하면 한번에 처리할 수 있다.
7. 행렬식: determinant. 표기법: $det A, |A|$
8. 행렬식의 성질
- det(I) = 1,
- det(AB) = det(A) x det(B)
- $det A = \frac{1}{detA}$
- 어느열이든 두 열이 완전히 같은 경우는 det A = 0. 예) $\begin{bmatrix} 2 & 2& 4 \\ 7 & 7& 5 \\ 3 & 3& 2 \end{bmatrix}$