#### 다음의 내용은 패스트캠퍼스 김도형 박사님의 강의자료를 정리한 것이다


### 벡터 a의 길이: norm ‖𝑎‖ 



```python
a = np.array([1, 2])
np.linalg.norm(a)
```




    2.23606797749979



### 단위벡터
- 길이가 1인 벡터

$$
\begin{align}
\dfrac{x}{\| x \|}
\end{align}
$$


```python
a = np.array([1, 0])
b = np.array([0, 1])
c = np.array([1/np.sqrt(2), 1/np.sqrt(2)])
np.linalg.norm(a), np.linalg.norm(b), np.linalg.norm(c)
```




    (1.0, 1.0, 0.9999999999999999)



### 유클리드 거리
- 두 벡터가 가리키는 점 사이의 거리
$$
\begin{align}
\| a - b \|^2 = \| a \|^2 + \| b \|^2 - 2 a^T b
\end{align}
$$

### 벡터의 내적 코사인 함수로 나타내기
$$ 
\begin{align}
a^Tb = \|a\|\|b\| \cos\theta
\end{align}
$$

### 직교
- 두 벡터가 이루는 각이 90도인 경우
- 코사인이 0이 된다
$$ 
\begin{align}
a^T b = b^T a = 0   \;\;\;\; \leftrightarrow \;\;\;\; a \perp b 
\end{align}
$$

### 정규직교
만약 $N$개의 단위벡터 $v_1, v_2, \cdots, v_N$가 서로 직교하면 **정규직교(orthonormal)**라고 한다.

$$ 
\begin{align}
\|v_i\| = 1 \;\;\leftrightarrow \;\; v_i^Tv_i = 1 
\end{align}
$$

$$ 
\begin{align}
v_i^T v_j = 0 \;\;(i \neq j) 
\end{align}
$$

### 코사인 거리
- 1에서 코사인 유사도만큼 뺀 것
$$ 
\begin{align}
\text{cosine distance} = 1 - \text{cosine similarity} = 1 - \dfrac{x^Ty}{\|x\|\|y\|}
\end{align}
$$



```python
a=np.array([4,5,2,2])
b=np.array([4,0,2,0])
c=np.array([2,2,0,1])

```


```python
#유클리드 거리
np.linalg.norm(a-b)
```




    5.385164807134504




```python
#코사인 거리
1- a@b/(np.linalg.norm(a)*np.linalg.norm(b))
```




    0.36112343500006017



### 투영성분
벡터 $a$를 다른 벡터 $b$에 직교하는 성분과 벡터 $b$에 평행한 성분으로로 분해할 수 있는데, 평행한 성분을 벡터 $b$에 대한 **투영성분(projection)**, 벡터 $b$에 수직인 성분을 벡터 $b$에 대한 **직교성분(rejection)**이라고 하며 각각 다음과 같이 표기한다.

$$ 
\begin{align}
a^{\Vert b} 
\end{align}
$$

$$ 
\begin{align}
a^{\perp b} 
\end{align}
$$

### 투영성분의 길이
$$ 
\begin{align}
\| a^{\Vert b} \| 
= \|a\|\cos\theta 
= \dfrac{\|a\|\|b\|\cos\theta}{\|b\|}  
= \dfrac{a^Tb}{\|b\|} 
= \dfrac{b^Ta}{\|b\|}
= a^T\dfrac{b}{\|b\|} 
\end{align}
$$

### 투영성분의 벡터
- 길이 * 방향

$$ 
\begin{align}
a^{\Vert b} = \dfrac{a^Tb}{\|b\|} \dfrac{b}{\|b\|}= \dfrac{a^Tb}{\|b\|^2}b  
\end{align}
$$


### 직교성분
$$ 
\begin{align}
a^{\perp b} = a - a^{\Vert b} 
\end{align}
$$

### 직선의 방정식
- 벡터w가 가르키는 방향과 만나면서, w와 직교하는 직선의 방정식

$$
\begin{align}
w^T(x - w) = 0
\end{align}
$$

정리하면 다음과 같아진다.

$$
\begin{align}
w^T(x - w) = w^Tx - w^Tw = w^Tx - \| w \|^2
\end{align}
$$

$$
\begin{align}
w^Tx - \| w \|^2 = 0
\end{align}
$$

이 직선과 원점 사이의 거리는 벡터 $w$의 놈 $\|w\|$이다.

$$ 
\begin{align}
\|w\| 
\end{align}
$$

### w에 수직인 직선의 방정식
이번에는 벡터 $w$가 가리키는 점을 지나야 한다는 조건을 없애고 단순히

* 벡터 $w$에 수직인

직선 $x$의 방정식을 구해보자.

이때는 직선이 $w$가 아니라 $w$와 방향이 같고 길이가 다른 벡터 $w'=cw$을 지날 것이다. $c$는 양의 실수이다. 

위에서 했던 방법으로 다시 직선의 방정식을 구하면 다음과 같다.

$$ 
\begin{align}
w'^Tx - \| w' \|^2 =  cw^Tx - c^2 \| w \|^2 = 0  
\tag{3.1.53}
\end{align}
$$

$$ 
\begin{align}
w^Tx - c \| w \|^2 = 0 
\tag{3.1.54} 
\end{align}
$$

여기에서 $c \| w \|^2$는 임의의 수가 될 수 있으므로 단순히 벡터 $w$에 수직인 직선의 방정식은 다음과 같이 나타낼 수 있다.

$$ 
\begin{align}
w^Tx - w_0 = 0 
\tag{3.1.55} 
\end{align}
$$

이 직선과 원점 사이의 거리는 다음과 같다.

$$ 
\begin{align}
c \| w \| = \dfrac{w_0}{\|w\|} 
\tag{3.1.56} 
\end{align}
$$

### 직선과 점의 거리

이번에는 직선 $w^Tx - \|w\|^2 = 0$ 과 이 직선 위에 있지 않은 점 $x'$ 사이의 거리를 구해보자.

벡터 $w$에 대한 벡터 $x'$의 투영성분 $x'^{\Vert w}$의 길이

$$
\begin{align}
\|x'^{\Vert w}\| = \dfrac{w^Tx'}{\|w\|} 
\tag{3.1.59}
\end{align}
$$

직선과 점 $x'$ 사이의 거리는 이 길이에서 원점에서 직선까지의 거리 $\|w\|$를 뺀 값의 절댓값이다. 

$$
\begin{align}
\left|  \|x'^{\Vert w}\| - \|w\| \right| = 
\left| \dfrac{w^Tx'}{\|w\|} - \|w\| \right| =
\dfrac{\left|w^Tx' - \|w\|^2 \right|}{\|w\|}
\tag{3.1.60}
\end{align}
$$

직선의 방정식이 $w^Tx - w_0 = 0$이면 직선과 점의 거리는 다음과 같다.

$$
\begin{align}
\dfrac{\left|w^Tx' - w_0 \right|}{\|w\|} 
\tag{3.1.61}
\end{align}
$$
       
- 분자값이 직선의 방정식과 유사해보이지만, 직선 위의 점이 아니라 다른 점을 x에 넣기 때문에 0이 아닌 값이 나온다

### 선형독립
벡터 집합 $x_1, x_2, \ldots, x_N$을 이루는 벡터의 선형조합이 영벡터가 되도록 하는 스칼라 계수 $c_1, c_2, \ldots, c_N$이 존재하면 이 벡터들이 **선형종속(linearly dependent)**이라고 한다. 단 $c_1 = c_2 = \cdots = c_N = 0$ 으로 계수가 모두 0인 경우는 제외한다.

$$ 
\begin{align}
c_1 x_1 + c_2 x_2 + \cdots + c_N x_N = 0  
\tag{3.2.1}
\end{align}
$$

반대로 벡터들의 선형조합이 0이 되면서 모두 0은 아닌 계수들이 존재하지 않으면 그 벡터들은 **선형독립(linearly independent)**이라고 한다. 

### 선형종속이 되는 경우 3가지
- 다중공선성: 특징행렬 X의 열벡터가 선형종속에 가까운 경우

#### 경우 1: 벡터의 개수가 벡터의 차원보다 크면 선형종속이다.
#### 경우 2: 값이 같은 벡터가 있으면 반드시 선형종속이다.
#### 경우 3: 어떤 벡터가 다른 벡터의 선형조합이면 반드시 선형종속이다.

### 랭크
- 서로 독립인 행/열의 최대 개수
- 정리) 행랭크와 열랭크는 항상 같다

### 풀랭크
- 랭크가 행의 개수와 열의 개수 중 작은 값과 같으면 **풀랭크(full rank)**라고 한다.

### 벡터공간과 기저벡터

여러 벡터를 선형조합을 하면 다른 벡터를 만들 수 있다. 벡터 N개가 서로 선형독립이면 이 벡터들을 선형조합하여 만들어지는 모든 벡터의 집합을 **벡터공간(vector space)** $V$라 하고 이 벡터공간의 차원을 $N$이라고 한다. 그리고 그 벡터들을 벡터공간의 **기저벡터(basis vector)**라고 한다. 

> **[정리] $N$개의 $N$차원 벡터 $x_1, x_2, \cdots, x_N$이 선형독립이면 이를 선형조합하여 모든 $N$차원 벡터를 만들 수 있다.**

### 정방행렬의 랭크와 역행렬
> **[정리] 정방행렬이 풀랭크면 역행렬이 존재한다. 역도 성립한다. 즉, 정방행렬의 역행렬이 존재하면 풀랭크**다.

### 벡터공간의 투영
만약 기저벡터 $v_1, v_2, \cdots, v_M$가 정규직교(orthonormal)이면 투영벡터 $x^{\Vert v}$는 각 기저벡터에 대한 내적값으로 표현된다.
​
$$
\begin{align}
x^{\Vert V} = (x^Tv_1)v_1 + (x^Tv_2)v_2 + \cdots + (x^Tv_M)v_M
\tag{3.2.47}
\end{align}
$$
​
그리고 투영벡터의 길이의 제곱은 각 기저벡터와의 내적의 제곱합이다.
​
$$ 
\begin{align}
\Vert x^{\Vert V} \Vert^2 = \sum_{i=1}^M (x^Tv_i)^2 
\tag{3.2.48}
\end{align}
$$

**직교벡터 $x^{\perp V}$는 기저벡터 $v_1, v_2, \cdots, v_M$으로 이루어진 벡터공간의 모든 벡터에 대해 직교한다**.

**벡터 $x$의 투영벡터 $x^{\Vert V}$은 기저벡터 $v_1, v_2, \cdots, v_M$으로 이루어진 벡터공간의 모든 벡터 중에서 가장 벡터 $x$와 가까운 벡터**

- 표준기저벡터: 기저벡터 중 하나만 1이고 나머지 0인 것

### 좌표변환
- 새로운 기저벡터에 대해 좌표를 표시한 것 

2차원의 경우를 예로 들어보자. 벡터 $x$의 기저벡터 $\{e_1, e_2\}$에 대한 좌표 $x_e$를 새로운 기저벡터 $\{g_1, g_2\}$에 대한 좌표 $x_g$로 변환하고자 한다.

새로운 기저벡터에 대한 좌푯값이 가리키는 실제 위치는 원래의 벡터가 가리키는 실제 위치와 같아야 되므로

$$ 
\begin{align}
x = x_{e1}e_1 + x_{e2}e_2 = x_{g1} g_1 + x_{g2} g_2  
\tag{3.2.63}
\end{align}
$$

$$ 
\begin{align}
x 
= \begin{bmatrix} e_1 & e_2 \end{bmatrix} x_e 
= \begin{bmatrix} g_1 & g_2 \end{bmatrix} x_g 
\tag{3.2.64}
\end{align}
$$

이 식에 

$$
\begin{align}
\begin{bmatrix} g_1 & g_2 \end{bmatrix}
= \begin{bmatrix} e_1 & e_2 \end{bmatrix} 
A
\tag{3.2.65}
\end{align}
$$

를 대입하면

$$ 
\begin{align}
x 
= \begin{bmatrix} e_1 & e_2 \end{bmatrix} x_e 
= \begin{bmatrix} e_1 & e_2 \end{bmatrix} A x_g
\tag{3.2.66}
\end{align}
$$

이 된다. 이 식으로부터 다음 식이 성립한다.

$$ 
\begin{align}
x_e = A x_g 
\tag{3.2.67} 
\end{align}
$$


$$ 
\begin{align}
x_g = A^{-1}x_e = Tx_e
\tag{3.2.68}  
\end{align}
$$

이 때 $A$의 역행렬 $T=A^{-1}$을 **변환행렬(transform matrix)**이라고 한다.



```python
e1 = np.array([1, 0])
e2 = np.array([0, 1])
g1 = np.array([1, 1]) / np.sqrt(2)
g2 = np.array([-1, 1]) / np.sqrt(2)
x = np.array([2, 2])
A = np.vstack([g1, g2]).T
A
```




    array([[ 0.70710678, -0.70710678],
           [ 0.70710678,  0.70710678]])




```python
# 변환행렬
Ainv = np.linalg.inv(A)
Ainv
```




    array([[ 0.70710678,  0.70710678],
           [-0.70710678,  0.70710678]])




```python
#g1 g2를 기저벡터로 가지는 새로운 좌표
Ainv.dot(x)
```




    array([2.82842712, 0.        ])



### 고윳값과 고유분해
정방 행렬 $A$에 대해 다음 식을 만족하는 영벡터가 아닌 벡터 $v$, 실수 $\lambda$를 찾을 수 있다고 가정하자.

$$ 
\begin{align}
Av = \lambda v
\tag{3.3.1}
\end{align}
$$

위 식을 만족하는 실수 $\lambda$를 **고윳값**(eigenvalue), 벡터 $v$를 **고유벡터**(eigenvector)라고 한다. 

$$ 
\begin{align}
Av - \lambda v = (A - \lambda I) v = 0 
\tag{3.3.2}
\end{align}
$$

- $v$와 방향이 같은 벡터는 모두 고유벡터가 되므로 보통 고유벡터를 표시할 때 길이가 1인 단위벡터가 되도록 정규화 한다

$$ 
\begin{align}
\dfrac{v}{\|v\|}
\tag{3.3.8}
\end{align}
$$

### 고윳값 찾기 : 특성방정식
아래의 식을 만족하는 해를 찾으면 된다
$$ 
\begin{align}
\det \left( A - \lambda I \right) = 0
\tag{3.3.16}
\end{align}
$$
단,  $A - \lambda I$는 역행렬이 존재하지 않는다(만약 역행렬이 존재하면 $v$는 영행렬이 되어야 하기 때문이다

## 정방행렬 특성

### 정방행렬) 고윳값 개수 찾기
- 중복된 고윳값을 각각 별개로 생각하고 복소수인 고윳값도 고려한다면 $N$차원 정방행렬의 고윳값은 항상 $N$개다.

### 고윳값과 행렬식 및 대각합과의 관계
$$
\begin{align}
\det(A)=\prod_{i=1}^N \lambda_i
\tag{3.3.28}
\end{align}
$$

$$
\begin{align}
\text{tr}(A) =\sum_{i=1}^N \lambda_i
\tag{3.3.29}
\end{align}
$$

### 고유벡터 구하기
- 특성방정식으로 고윳값을 알아내면 고윳값분해 식의 해를 찾아 고유벡터 $v$를 구할 수 있다


$$
\begin{align}
(A - \lambda I)v = 0
\tag{3.3.36}
\end{align}
$$

- 고윳값이 중복되었다고 고유벡터도 중복되는것은 아니다

- 중복된 고윳값 $\lambda$에 대해 서로 다른 고유벡터 $v_1$, $v_2$가 존재하면 이 두 벡터의 선형조합$
\begin{align}
c_1v_1 + c_2v_2
\tag{3.3.48}
\end{align}
$

도 고윳값 $\lambda$에 대한 고유벡터이다

### 넘파이로 고유분해하기
- eig()
- 결과로 나오는 고유벡터의 행렬은 열을 고유벡터로 가진다


```python
A= np.array([[1,-2],[2,-3]])
w1, V1= np.linalg.eig(A)
print(w1)
print(V1)
```

    [-0.99999998 -1.00000002]
    [[0.70710678 0.70710678]
     [0.70710678 0.70710678]]



```python
B=np.array([[2,1],[1,2]])
w2, V2= np.linalg.eig(B)
print(w2)
print(V2)
```

    [3. 1.]
    [[ 0.70710678 -0.70710678]
     [ 0.70710678  0.70710678]]


### 대각화 :N차원의 정방행렬인 경우
**고유벡터행렬** $V$은 고유벡터를 열벡터로 옆으로 쌓아서 만든 행렬이다.

$$
\begin{align}
V = \left[ v_1 \cdots v_N \right]
\tag{3.3.50}
\end{align}
$$



**고윳값행렬** $\Lambda$은 고윳값을 대각성분으로 가지는 대각행렬이다.

$$
\begin{align}
\Lambda =
\begin{bmatrix}
\lambda_{1} & 0 & \cdots & 0 \\
0 & \lambda_{2} & \cdots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
0 & 0 & \cdots & \lambda_{N} \\
\end{bmatrix}
\tag{3.3.52}
\end{align}
$$

$$
\begin{align}
\Lambda \in \mathbf{R}^{N \times N}
\tag{3.3.53}
\end{align}
$$

따라서

$$ 
\begin{align}
AV = V\Lambda 
\tag{3.3.55}
\end{align}
$$

#### 더 나아가기
만약 **고유벡터행렬 $V$의 역행렬이 존재한다면** 행렬을 다음처럼 고유벡터행렬과 고윳값행렬의 곱으로 표현할 수 있다. 이를 행렬의 **대각화(diagonalization)**라고 한다. 

$$ 
\begin{align}
A = V \Lambda V^{-1} 
\tag{3.3.56}
\end{align}
$$


이때 A의 역행렬은
$$ 
\begin{align}
A^{-1} = V \Lambda^{-1} V^{-1} 
\end{align}
$$

- 고유벡터행렬 $V$의 역행렬이 존재한다는 것은 고유벡터행렬의 각각의 열행렬이 서로 독립이므로 풀랭크라는 의미이다
- 행렬이 대각화 가능하려면 고유벡터가 선형독립이어야 한다
- 대각행렬의 역행렬은 각 대각성분의 역수로 이루어진 대각행렬이므로 0인 고유값만 없으면 항상 역행렬이 존재한다


```python
B= np.array([[2,3],[2,1]])
B
            
```




    array([[2, 3],
           [2, 1]])




```python
w,V=np.linalg.eig(B)
print(w)
print(V)
```

    [ 4. -1.]
    [[ 0.83205029 -0.70710678]
     [ 0.5547002   0.70710678]]



```python
V_inv=np.linalg.inv(V)
V_inv
```




    array([[ 0.72111026,  0.72111026],
           [-0.56568542,  0.84852814]])




```python
#대각화 중간에 들어가는 람다행렬
np.diag(w)
```




    array([[ 4.,  0.],
           [ 0., -1.]])




```python
#대각화 하기
V@np.diag(w)@V_inv
#결과가 B와 동일하다
```




    array([[2., 3.],
           [2., 1.]])




```python
C= np.array([[1,1],[0,1]])
C
```




    array([[1, 1],
           [0, 1]])




```python
w,V=np.linalg.eig(C)
print(w)
print(V)
```

    [1. 1.]
    [[ 1.00000000e+00 -1.00000000e+00]
     [ 0.00000000e+00  2.22044605e-16]]



```python
np.linalg.matrix_rank(V)
#랭크가 1이므로 역행렬이 존재하지 않는다(풀랭크가 아니다)
```




    1






```python
#A 역행렬 구하기
A = np.array([[2, 3], [2, 1]]) 
 
w, V = np.linalg.eig(A)
V_inv= np.linalg.inv(V)
```


```python
#중간 대각행렬의 인버스
np.linalg.inv(np.diag(w))
```




    array([[ 0.25,  0.  ],
           [-0.  , -1.  ]])




```python
np.diag(1/w)
```




    array([[ 0.25,  0.  ],
           [ 0.  , -1.  ]])




```python
V@np.diag(1/w)@V_inv
```




    array([[-0.25,  0.75],
           [ 0.5 , -0.5 ]])




```python
np.linalg.inv(A)
```




    array([[-0.25,  0.75],
           [ 0.5 , -0.5 ]])



## 대칭행렬


### 대칭행렬을 랭크1 행렬의 합으로 분해하기

$N$차원 대칭행렬 $A$는 다음처럼 $N$개의 랭크-1 행렬 $A_i = v_i v_i^T$ 의 합으로 표시할 수 있다.

$$ 
\begin{align}
\begin{aligned}
A 
&= V\Lambda V^T \\
&= 
\begin{bmatrix}
v_1 & v_2 & \cdots & v_N
\end{bmatrix}
\begin{bmatrix}
\lambda_{1} & 0 & \cdots & 0 \\
0 & \lambda_{2} & \cdots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
0 & 0 & \cdots & \lambda_{N} \\
\end{bmatrix}
\begin{bmatrix}
v_1^T \\ v_2^T \\ \vdots \\ v_N^T
\end{bmatrix} \\
&=
\begin{bmatrix}
\lambda_{1}v_1 & \lambda_{2}v_2 & \cdots & \lambda_{N}v_N
\end{bmatrix}
\begin{bmatrix}
v_1^T \\ v_2^T \\ \vdots \\ v_N^T
\end{bmatrix} \\
\end{aligned}
\tag{3.3.71}
\end{align}
$$

따라서 $N$차원 대칭행렬 $A$는

$$
\begin{align}
A = \sum_{i=1}^{N} {\lambda_i} v_i v_i^T  = \sum_{i=1}^{N} {\lambda_i} A_i = \lambda_1 A_1 + \cdots + \lambda_N A_N 
\tag{3.3.72}
\end{align}
$$



```python
A = np.array([[60., 30., 20.],
              [30., 20., 15.],
              [20., 15., 12.]])

w, V = np.linalg.eig(A)

# v1 = V[:, 0:1]
# v2 = V[:, 1:2]
# v3 = V[:, 2:3]
# A1 = v1 @ v1.T
# A2 = v2 @ v2.T
# A3 = v3 @ v3.T
```


```python
w
```




    array([84.49913563,  7.33962395,  0.16124042])




```python
w1, w2, w3 = w
```


```python
V
```




    array([[ 0.82704493,  0.54744843,  0.12765933],
           [ 0.4598639 , -0.52829024, -0.71374689],
           [ 0.32329844, -0.64900666,  0.68867153]])




```python
v1 = V[:, 0:1]
v1
```




    array([[0.82704493],
           [0.4598639 ],
           [0.32329844]])




```python
v2 = V[:, 1:2]
v2
```




    array([[ 0.54744843],
           [-0.52829024],
           [-0.64900666]])




```python
v3 = V[:, 2:3]
v3
```




    array([[ 0.12765933],
           [-0.71374689],
           [ 0.68867153]])




```python
A1=w1* v1@v1.T
A1
```




    array([[57.79768857, 32.13739648, 22.59357583],
           [32.13739648, 17.8694387 , 12.56276371],
           [22.59357583, 12.56276371,  8.83200836]])




```python
A2=w2* v2@v2.T
A2
```




    array([[ 2.19968372, -2.12270483, -2.60775134],
           [-2.12270483,  2.04841985,  2.51649195],
           [-2.60775134,  2.51649195,  3.09152039]])




```python
A3=w3* v3@v3.T
A3
```




    array([[ 0.00262772, -0.01469165,  0.01417551],
           [-0.01469165,  0.08214145, -0.07925566],
           [ 0.01417551, -0.07925566,  0.07647125]])




```python
A1+A2+A3
```




    array([[60., 30., 20.],
           [30., 20., 15.],
           [20., 15., 12.]])



**만약 0인 고윳값이 없다면** 역행렬도 다음처럼  $N$개의 랭크-1 행렬 $A_i = v_i v_i^T$ 의 합으로 표시할 수 있다.

$$ 
\begin{align}
A^{-1} =
V \Lambda^{-1} V^T = \sum_{i=1}^{N} \dfrac{1}{\lambda_i} v_i v_i^T 
= \dfrac{1}{\lambda_1} A_1 + \cdots + \dfrac{1}{\lambda_N} A_N 
\tag{3.3.74}
\end{align}
$$

- 대칭행렬의 역행렬은 중간식이 1/w로 이루어진 행렬이다
- np.diag(1/w)


```python
np.linalg.inv(A)
```




    array([[ 0.15, -0.6 ,  0.5 ],
           [-0.6 ,  3.2 , -3.  ],
           [ 0.5 , -3.  ,  3.  ]])




```python
A1_inv=1/w1* v1@v1.T
A1_inv
```




    array([[0.0080948 , 0.00450097, 0.00316432],
           [0.00450097, 0.00250269, 0.00175947],
           [0.00316432, 0.00175947, 0.00123696]])




```python
A2_inv=1/w2* v2@v2.T
A2_inv
```




    array([[ 0.04083313, -0.03940415, -0.04840816],
           [-0.03940415,  0.03802519,  0.04671409],
           [-0.04840816,  0.04671409,  0.05738845]])




```python
A3_inv=1/w3* v3@v3.T
A3_inv
```




    array([[ 0.10107208, -0.56509682,  0.54524384],
           [-0.56509682,  3.15947213, -3.04847356],
           [ 0.54524384, -3.04847356,  2.94137459]])




```python
A1_inv+A2_inv+A3_inv
```




    array([[ 0.15, -0.6 ,  0.5 ],
           [-0.6 ,  3.2 , -3.  ],
           [ 0.5 , -3.  ,  3.  ]])



### 대칭행렬의 고윳값 부호
> **[정리] 대칭행렬이 양의 정부호(positive definite)이면 고윳값은 모두 양수다. 역도 성립한다.**

> **[정리] 대칭행렬이 양의 준정부호(positive semidefinite)이면 고윳값은 모두 0이거나 양수다. 역도 성립한다.**



- 추가)대칭행렬: PD<=> 고유값은 모두 양수

## 분산행렬


- 임의의 실수 행렬  𝑋 에 대해   $X^TX$ 인 정방행렬을 분산행렬(scatter matrix)이라고 한다

> **[정리] 분산행렬은 양의 준정부호(positive semidefinite)이고 고윳값은 0보다 같거나 크다.**


연습 문제 3.3.9

(1) 붓꽃(Iris) 특징데이터 행렬  𝑋 의 분산행렬을 구하고 이 분산행렬의 고윳값들을 구하라.

(2) 보스턴 집값(Boston House Price) 특징데이터 행렬  𝑋 의 분산행렬을 구하고 이 분산행렬의 고윳값들을 구하라.


```python
#(1)
from sklearn.datasets import load_iris
iris=load_iris()
X=iris.data

```


```python
X[:3]
```




    array([[5.1, 3.5, 1.4, 0.2],
           [4.9, 3. , 1.4, 0.2],
           [4.7, 3.2, 1.3, 0.2]])




```python
iris_sca= X.T@X
iris_sca
```




    array([[5223.85, 2673.43, 3483.76, 1128.14],
           [2673.43, 1430.4 , 1674.3 ,  531.89],
           [3483.76, 1674.3 , 2582.71,  869.11],
           [1128.14,  531.89,  869.11,  302.33]])




```python
w,V= np.linalg.eig(iris_sca)
print(w)
```

    [9.20830507e+03 3.15454317e+02 1.19780429e+01 3.55257020e+00]



```python
#2
from sklearn.datasets import load_boston
boston= load_boston()
X= boston.data

boston_sca= X.T@X
boston_sca[:3]
```




    array([[4.39703436e+04, 4.68702660e+02, 3.24790952e+04, 6.48084600e+01,
            1.22612317e+03, 1.08219511e+04, 1.68514980e+05, 3.46627456e+03,
            4.11186651e+04, 1.17307321e+06, 3.64715518e+04, 4.99455291e+05,
            3.72684187e+04],
           [4.68702660e+02, 3.40029000e+05, 2.09030900e+04, 2.70000000e+02,
            2.48444175e+03, 3.87184670e+04, 2.05485400e+05, 3.82992940e+04,
            2.29180000e+04, 1.72295450e+06, 9.61321500e+04, 2.23960499e+06,
            3.80196800e+04],
           [3.24790952e+04, 2.09030900e+04, 8.65256299e+04, 4.45170000e+02,
            3.43239536e+03, 3.44618165e+04, 4.49313490e+05, 1.62206733e+04,
            7.17656500e+04, 2.72134904e+06, 1.06875320e+05, 1.89702529e+06,
            8.62407050e+04]])




```python
w,V= np.linalg.eig(boston_sca)
print(w)
```

    [1.58386796e+08 1.18747372e+07 4.17002244e+05 1.61644573e+05
     2.52697480e+04 1.47629635e+04 8.18396001e+03 6.07326738e+03
     4.23577535e+03 6.06399504e+02 3.27412564e+02 3.04157837e+01
     2.19326965e+00]


### 분산행렬의 역행렬
> **[정리] 행렬 $X$가 풀랭크이면 이 행렬의 분산행렬 $X^TX$의 역행렬이 존재한다.**

- 양의 정부호인 대칭행렬은 항상 역행렬이 존재한다
- 하지만 역행렬이 존재하는 대칭행렬은 항상 양의 정부호라고 할 수 없다
- 음의 정부호인 대칭행렬도 역행렬이 존재하는 경우가 있기 때문이다





$N$차원 정방행렬 $A$에 대해 

1. 행렬 $A$는 $N$개의 고윳값-고유벡터를 가진다(복소수인 경우와 중복인 경우를 포함).
2. 행렬의 **대각합은 모든 고윳값의 합**과 같다.
3. 행렬의 **행렬식은 모든 고윳값의 곱**과 같다.
4. 행렬 $A$가 **대칭행렬**이면 $N$개의 **실수 고윳값**을 가지며 고유벡터들이 서로 **직교(orthogonal)**이다.
5. 행렬 $A$가 **대칭행렬**이고 고윳값이 모두 **양수**이면 **양의 정부호(positive-definite)이고 역행렬이 존재한다**. 역도 성립한다.
6. 행렬 $A$가 어떤 행렬 $X$의 **분산행렬** $X^TX$이면 **0 또는 양의 고윳값을 가진다**.
7. 행렬 $X$가 **풀랭크이면 분산행렬 $X^TX$은 역행렬이 존재**한다.

## 특잇값 분해
- 정방행렬은 고유분해로 고윳값과 고유벡터를 찾을 수 있었다
- 정방행렬이 아닌 행렬은 고유분해가 불가능
- 하지만 고유분해와 비슷한 특잇값 분해를 할 수 있다.

$N \times M$ 크기의 행렬 $A$에 대해
$$ 
\begin{align}
A = U\Sigma V^T 
\tag{3.4.1}
\end{align}
$$

여기에서 $U, \Sigma, V$는 다음 조건을 만족해야 한다.

* 대각성분이 양수인 대각행렬이어야 한다. 큰 수부터 작은 수 순서로 배열한다.

$$
\begin{align}
\Sigma \in \mathbf{R}^{N \times M}
\tag{3.4.2}
\end{align}
$$

* $U$는 $N$차원 정방행렬로 모든 열벡터가 단위벡터이고 서로 직교해야 한다. 

$$
\begin{align}
U \in \mathbf{R}^{N \times N}
\tag{3.4.3}
\end{align}
$$

* $V$는 $M$차원 정방행렬로 모든 열벡터가 단위벡터이고 서로 직교해야 한다. 

$$
\begin{align}
V \in \mathbf{R}^{M \times M}
\tag{3.4.4}
\end{align}
$$

위 조건을 만족하는 행렬 $\Sigma$의 대각성분들을 **특잇값(singular value)**, 행렬 $U$의 열벡터들을 **왼쪽 특이벡터**(left singular vector), 행렬 $V$의 행벡터들을 **오른쪽 특이벡터**(right singular vector)라고 부른다.

> **[정리] 특이분해는 모든 행렬에 대해 가능하다. 즉 어떤 행렬이 주어지더라도 위와 같이 특이분해할 수 있다.** 

### 1차원 근사
2차원 평면 위에 3개의 2차원 벡터 $a_1, a_2, a_3$가 있다. 원점을 지나면서 모든 점들과 가능한 한 가까이 있는 직선을 만들고 싶다면 직선의 방향을 어떻게 해야 할까? 직선의 방향을 나타내는 단위 벡터를 $w$라고 하자. 


```python

```

dd9ebff8aca64cacd11676ecee9029ef2b42ddb8
ipynb
Jupyter Notebook
math/01_ linear algebra.ipynb
dayoungMM/TIL
b844ef5621657908d4c256cdfe233462dd075e8b
MIT
math/01_ linear algebra.ipynb
dayoungMM/TIL
b844ef5621657908d4c256cdfe233462dd075e8b
MIT
math/01_ linear algebra.ipynb
dayoungMM/TIL
b844ef5621657908d4c256cdfe233462dd075e8b
MIT
Qwen/Qwen-72B
1. YES
2. YES