TIL/04_AI Math

AI 기초수학 - 벡터와 공간 (2)

JJO.OYA 2022. 5. 27. 01:28

[10]

# 랭크

- rank(A) : 선형 독립인 행 혹은 열의 개수

- 랭크의 성질 : 열 랭크과 행 랭크가 같음

 

$$rank(A) = rank(A^T)$$

 

- 선형 독립 (rank = 2)

$$\begin{bmatrix}y1 \\y2 \end{bmatrix} =  \begin{bmatrix}2x_1+7x_2 \\5x_1+1x_2 \end{bmatrix} =  \begin{bmatrix}2 & 5 \\7 & 1 \end{bmatrix}  \begin{bmatrix}x_1 \\x_2 \end{bmatrix} =x1 \begin{bmatrix}2 \\7 \end{bmatrix} +x_2 \begin{bmatrix}5 \\1 \end{bmatrix} $$

 

- 선형 종속 (rank = 1)

$$\begin{bmatrix}y1 \\y2 \end{bmatrix} =  \begin{bmatrix}2x_1+4x_2 \\3x_1+6x_2 \end{bmatrix} =  \begin{bmatrix}2 & 4 \\3 & 6 \end{bmatrix}  \begin{bmatrix}x_1 \\x_2 \end{bmatrix} =x1 \begin{bmatrix}2 \\4 \end{bmatrix} +x_2 \begin{bmatrix}3 \\6 \end{bmatrix}$$

$$=  2x_1\begin{bmatrix}1 \\2 \end{bmatrix} +3x_2 \begin{bmatrix}1 \\2 \end{bmatrix} =(2x_1+3x_2) \begin{bmatrix}1 \\2 \end{bmatrix} $$

 

# 벡터 공간과 부분 공간 기자(basis)

# matrix_rank() >> rank 계산하기

x1 = np.array([[2,7],[5,1]])
print(x1)
print()
print(np.linalg.matrix_rank(x1))

# rank가 2개 >> 선형독립
[[2 7]
 [5 1]]

2

>> rank가 2개 : 선형 독립

 

x10 = np.array([[1,2],[3,5]])
print(x10)
print()
print(np.linalg.matrix_rank(x10))
[[1 2]
 [3 5]]

2

>> rank가 2 = 선형 독립

 

x2 = np.array([[2,4],[3,6]])
print(x2)
print()
print(np.linalg.matrix_rank(x2))

# rank가 1개 >> 선형종속
[[2 4]
 [3 6]]

1

>> rank가 1 = 선형 종속

 

 

 

 

[11]

# 벡터의 덧셈

1)

# 벡터의 덧셈과 뺄셈

x = [2,3]
y = [3,1]

# zip() 이용 : 2 벡터의 1번째 원소끼리 더하고 2번째 원소끼리 더하기 위함

[i+j for i, j in zip(x,y)]

[5, 4]

 

# zip()

print(zip([1,2,3],[4,5,6],[7,8,9]))
print()
print(list(zip([1,2,3],[4,5,6],[7,8,9])))
# 같은 위치끼리 묶어줌

[(1,4,7),(2,5,8),(3,6,9)]

 

2)

import numpy as np

# x,y 리스트를 numpy의 Array 객체로 변화한 후 변수에 저장
u = np.array(x)
v = np.array(y)

#u, v 변수에 덧셈 연사자 적용
w=u+v
print(w)

[5,4]

 

 

 

# 벡터의 뺄셈

1)

x = [2,3]
y = [3,1]

[i- j for i,j in zip(x,y)]

[-1,2]

 

2)

x = [2,3]
y = [3,1]

u = np.array(x)
v = np.array(y)

u-v

array([-1,2])

 

 

 

[13]

# 벡터의 곱셈

1)

# 벡터의 내적(****)

# 벡터의 곱셈
x = [3,4]
c = 8

[c*i for i in x]

[24, 32]

 

>> x 변수에 원소 두 개를 갖는 리스트

     c 변수에 스칼라 상수 8을 저장

 

>> x 리스트 원소 각각에 c 상수를 곱한 결과를 리스트로 변환

 

2)

u = np.array([3,4])
c = 8

u*c

[24, 32]

 

 

 

# 벡터의 내적

- 인공지능 알고리즘에서 유사도 기준은 벡터 간 거리를 이용하는데, 이때 내적 사용

# 벡터의 내적
u = np.array([6,6])
v = np.array([12,6])

np.dot(u,v)
# 벡터의 내적 >> scala
# 72+36 = 108

108

 

>> numpy.dot()

 

 

$$\vec{A}  ·    \vec{B}  =  |  \vec{A}  | |  \vec{B}  | cos \theta $$

 

- 내적 결과는 스칼라(실수)

 

$$\vec{a}  ·    \vec{b}  =  |  \vec{a}  | |  \vec{b}  | cos  0^{0} $$

 

 

 

 

# 벡터의 외적

- 외적 결과가 행렬인 경우 외적

- 3차원 벡터의 외적 결과가 3차원인 경우 벡터곱

 

$$\vec{A}    \times     \vec{B}  =  |  \vec{A}  | |  \vec{B}  | sin   \theta  $$

 

 

1)

# 벡터의 외적

a = (1,3,4)
b = (2,4,6)

def cross(a,b):
    c = [a[1]*b[2]-a[2]*b[1],
         a[2]*b[0]-a[0]*b[2],
         a[2]*b[1]-a[1]*b[2]
         ]
    return c
    
cross(a,b)

[2,2,-2]

 

 

2)

np.cross(a,b)

[2,2,-2]

 

 

 

 

[14]

# 직교 벡터(Orthogonal vector)

- SVM 원리 : 마진을 최대로 하는 결정 경계

 

$$\vec{w}    ·      \vec{u}   \geq   k$$

 

이면, ● 범주, 그렇지 않다면 ■

 

- 내적 한다는 의미는 u를 w에 투영하여 그 길이가 길어서 결정 경계를 넘으면 오른쪽, 짧으면 왼쪽

- 투영 : 물체의 형상을 3차원 공간이나 2차원 평면에 똑같이 옮기는 작업

 

 

$$ \|  a  \|^2 +\|  b  \|^2 =  \| a+b \|^2$$

 

$$x^Tx+y^Ty=(x+y)^T(x+y)$$

 

- 두 벡터가 직교일 경우, 두 벡터의 내적은 0

 

$$ab =  \begin{bmatrix}a_1,a_2,...,a_n \end{bmatrix}  \begin{bmatrix}b_1\\b_2\\ \vdots \\b_n \end{bmatrix} =  \begin{bmatrix}a_1b_1 , a_2b_2,...,a_nb_n \end{bmatrix} =0$$

 

 

 

# 벡터의 크기 = 벡터의 길이 = 벡터의 norm = |v| = ||v||

 

$$| \vec{a} + \vec{b}| =  \sqrt{(a_1+a_2)^2+(b_2+b_2)^2}  $$

 

- np.linalg.norm()

  ord = 1 : L1 >> 컴퓨터 비전에서 주로 씀

  x = [1,2,3]일 때, ||x|| = 1+2+3  >> 변수 선택 가능

 

  ord = 2 : L2  >> K-평균 클러스터링, K-최근접

  x = [1,2,3]일 때, ||x|| = sqrt(1+2+3)  >> 회귀 분석

 

import numpy as np

a = np.array([1,2])

np.linalg.norm(a)

2.23606797749979

 

# L1 norm

np.linalg.norm(a, ord =1)
# 1+2

3.0

 

# L2 norm

np.linalg.norm(a, ord =2) 
# sqrt(1+2)

2.23606797749979

 

 

 

# 벡터의 거리/유사도

 

- 벡터의 거리 : 두 벡터 간 거리

- 거리가 가까울수록 그 특성(feature)들이 비슷 

 

- 유클리드 거리

  두 벡터 간 직선 거리

 

$$d(x,y) =   \sqrt{(x_1+y_1)^2+(x_2+y_2)^2} $$

 

# 유클리디언 거리
from scipy.spatial import distance

# 두 점 p1, p2 명시

p1 = (1,2,3)
p2 = (4,5,6)

# 두 점 p1, p2 간 유클리드 거리 구하기

distance.euclidean(p1,p2)

# 두 벡터 간 직선 거리

 

 

- 맨해튼 거리

  사각형 격자로 된 지도에서 출발점부터 도착점까지 가로지르지 않고 갈 수 있는 최단 거리를 구하는 공식

$$d(x,y) =  |x_1-x_2| + |y_1-y_2|$$

 

 

# 맨하탄 거리

from math import *

# 두 점 p1, p2 명시

p1 = (1,2,3)
p2 = (4,5,6)

def 맨하탄거리(x,y):
    return sum(abs(a-b) for a, b in zip(x,y))

# d = |x1-x2| + |y1-y2|

맨하탄거리(p1,p2)

# 사각형 격자로 된 지도에서 건물을 피해 목적지를 찾음

>> abs(a-b) : 절댓값 |a-b|

     zip(x,y) : 벡터. x 모든 원소가 y랑 짝을 이룸

 

 

- 코사인 유사도

  두 벡터의 방향이 같을수록 벡터가 비슷하다고 간주하여 두 벡터 간의 각인 코사인 값

 

  각도가 0일 때 가장 크므로 두 벡터가 같은 방향 >> 코사인 유사도 = 최댓값 1

  각도가 90도 가까워 지면 코사인 유사도가 0에 가까워짐

 

$$유사도 = cos \theta  =  \frac{A·B}{||A|| ||B||} $$

 

 

# 코사인 유사도

from numpy import dot
import numpy as np
from numpy.linalg import norm

def cos_sim(a,b):
    return dot(a,b) / (norm(a)*norm(b))

# cos@ = (A dot B) / ||A||*||B||

doc1 = np.array([1,1,1,1,0])
doc2 = np.array([1,0,1,0,1])
doc3 = np.array([2,1,1,1,1])

# 유사도 구하기

print(cos_sim(doc1,doc2)) # 문서1, 문서2 간 코사인 유사도
print(cos_sim(doc1,doc3)) # 문서1, 문서3 간 코사인 유사도
print(cos_sim(doc2,doc3)) # 문서2, 문서3 간 코사인 유사도

# 결론 : 문서1, 문서3 간 코사인 유사도가 가장 높음
0.5773502691896258
0.8838834764831843
0.8164965809277259

>> 문서 1과 3의 유사도가 가장 높음

 

 

 

 

[15]

# 행렬-벡터의 곱

$$A \vec{x}=b $$

 

- 행렬 A가 mxn, 벡터 x가 nx1일 때, 그 결과는 mx1

 

$$ \begin{bmatrix}a_{11} & a_{21} \\a_{12} & a_{22} \end{bmatrix}  \begin{bmatrix}x_1 \\ x_2 \end{bmatrix} = x_1 \begin{bmatrix}a_{11}\\a_{21} \end{bmatrix}+x_2\begin{bmatrix}a_{12}\\a_{22} \end{bmatrix}$$

 

 

# 행렬의 열 공간

- col(A) = span{A의 선형 독립}

- A: span{col(A)}

 

$$A \vec{x} =  \begin{bmatrix}-2 & 4 & 2 \\6 & -3 &3\\5 & -3 & 2\end{bmatrix} \begin{bmatrix}x_1 \\x_2\\x_3 \end{bmatrix}   = \begin{bmatrix}b_1 \\b_2 \\b_3 \end{bmatrix} $$

 

$$x_1 \begin{bmatrix}-2\\6\\5 \end{bmatrix} +x_2 \begin{bmatrix}4\\3\\3 \end{bmatrix} +x_3 \begin{bmatrix}2\\3\\2 \end{bmatrix} = \begin{bmatrix}b_1 \\b_2 \\b_3 \end{bmatrix} $$

 

>> 해를 가지는 경우

- b 벡터가 모두 0인 경우 b= [0,0,0]

 

- x = [1 0 0], [0 1 0], [0 0 1]

 

 

 

# 행렬의 영 공간

$$A \vec{x} = 0$$

 

$$A \vec{x} =  \begin{bmatrix}-2 & 4 & 2 \\6 & -3 &3\\5 & -3 & 2\end{bmatrix} \begin{bmatrix}x_1 \\x_2\\x_3 \end{bmatrix}   = \begin{bmatrix}0 \\0 \\0 \end{bmatrix} $$

 

 

 

# 상삼각행렬

 

$$A =  \begin{bmatrix}1 & 2 & 3 & 1 \\0 & 1 & 1 & 0 \\0 & 0 & 1 & 2\end{bmatrix} $$