티스토리 뷰

Machine Learning 입문

3. 선형 대수

DWD85 2024. 12. 24. 14:23

 

> 행렬에서 스칼라는 크기 만으로 나타낼 수 있는 행렬에서의 가장 작 물리량 

> Index Location으로 스칼라 값을 가져올 수 있다. 

df = pd.read_csv(".\data\house_prices.csv", encoding ="cp949")
print(df.iloc[2,4])
print(df.iloc[2,3] + df.iloc[4,5])

 

> 벡터는 스칼라를 모아서 표현. 

> 크기와 방향이 같으면 모두 동일한 벡터 

> 리스트는 벡터다 

> 열/행 벡터 구분 가능하고 그냥 벡터면 기본적으로 열 벡터를 의미한다. 

 

> 벡터 덧셈, 뺄셈을 하기 위해서는 길이 즉 차원이 같아야 한다.

 

> 벡터의 덧셈, 뺄셈은 기하학적으로 나타낼 수 있다. 

 

> 스칼라가 모여서 벡터, 벡터가 모여서 행렬이 된다. 

> 소문자 평문(아무런 효과도 주지 않은) = 스칼라(Scalar)  

> 소문자 Bold = 벡터 

> 대문자 Bold = 행렬 

> 대문자 평문 = 확률변수 

 

a = np.array(range(0,10))
print(a)
print(a.reshape(10,1))
print(a.reshape(2,5))
print(a.reshape(-1,5))
print(a.reshape(2,-1))

 

> 행렬을 만들 때 np.array()를 활용

> a.reshape()을 활용해서 행렬 크기를 변경 

> -1은 알아서 해라는 뜻임, 행이나 열 기준으로 알아서 맞춰라

> reshape(-1,#)을 반대 보다 더 많이 씀, 머신러닝 할 때 데이터의 행이 더 많기 때문 

> 벡터라고 생각하지만 엄밀히 말해서 행렬임 왜냐하면 []가 두 개이기 때문. 

 

b = a.reshape(2,-1)
b.reshape(-1)

 

> reshape(-1)은 행렬을 벡터로 바꿔줌 

> 딥러닝 할 때 많이 씀, 이미지 처리에 많이 씀.

> 이미지 픽셀의 정보를 행 벡터로 만들어준다, 픽셀이 feature가 된다.

> 해상도를 높이면 데이터 크기가 너무 커지기 때문에 처음 시작할 땐 해상도를 낮춰서 진행 필요

 

A = np.array([[1,2],[3,4]])
B = np.array([[5,6],[9,12]])

C = np.concatenate((A,B), axis=0)
D = np.concatenate((A,B), axis=1)

 

> concatenate는 행렬을 합치는 함수 

> axis =0이면 행 방, 1이면 열 방향

 

> 행렬 곱에선 앞 열, 뒤 행 크기가 같아야 함.

> 행렬 곱 후 행렬의 크기는 달라진다. 

> 같은 크기의 두 행렬의 각 원소의 곱은 동그라미로 표시한다 A  B.

 

> Kronecker product 곱도 있음. 

> 행렬 곱은 교환 법칙 성립하지 않음 

 

 

> 전체 행렬은 행과 열을 바꾸는 행렬. 

> 표현 방법은 T이다, ' 표기법은 미분이랑 헷갈려서 안 씀

 

> 스칼라에는 Transpose가 안 붙음, 1행 1 열이기 때문.

> AB Transpose 하면 순서가 바뀜. 

> 행 벡터를 Transpose로 표시한다.

 

 

 

 

> 대각선 기준으로 같은 값을 가진 행렬 (거의 주인공 급으로 중요함)

> 대칭 행렬은 정사각 행렬이다. 

 

> 행렬과 전치 행렬의 곱은 앞의 행 by 뒤의 열 행렬로 되고 대칭 행렬이 됨. 

> 각 값은 행렬의 공분산이고 이 행렬을 공분산 행렬이라고 한다. 

> 엄밀하게 얘기하면 공분산 행렬이 아님 (중간 생략된 게 있음), 개념상 공분산으로 보는것임.

> XX^T는 506 x 506 행렬이 되어 크기가 커지고 이건 의미가 크게 없음. feature에 대한 관계 값이 아니기 때문.

> 머신러닝은 feature보다 행이 훨씬 큰 데이터 형태이기 때문에 다른 Case는 생각할 필요 없음. 

> 공분산 행렬이 중요.

 

x = df[['CRIM', 'NOX', 'RM', 'AGE', 'TAX']]

x_t = np.transpose(x)
x_t = x.T

x_t@x
x_t.dot(x)

 

> 단위행렬 AI = IA = A 같음

> 지시함수도 I를 쓰는데 차이점은 지시 함수는 I 후 여러 조건들이 붙음

 

 

> one vector는 1= (1,1,1) #열 행렬, 1^T = (1,1,1)

> zero matrix 0 = ([0,0], [0,0], [0,0]) #크기는 상황에 따라 다름 

 

> 3x3의 행렬식은 육면체의 부피이다.

> 2x2는 평행 사변형의 넓이이다. 

> 정방행렬 즉 정사각 행렬에서만 가능.

 

 

> 부피가 0, 그림으로 보면 같은 방향의 벡터가 있기 때문. 

> feature가 모자라면 파생 변수를 만들었을 때 의미가 없다. det 하면 0이기 때문. 

> 파생 변수인 Sum, Avg 만들었을 때 데이터 분석 기준에선 의미가 있을 수 있으나, 머신러닝 관점에선 의미가 없다.

> 데이터의 중복값이 있는지 행렬식으로 확인해 볼 수 있다. 

> 행렬식이 0이어도 머신러닝 결과가 더 좋을 수 있다 하지만, 가능성을 높이기 위해 하나의 가능성이다.

> x1, x4가 det가 0이면 각각 x1, x4, x1&x4 넣어보고 결과 잘 나온 조합으로 한다. (이걸 정하는 분야가 차원 축소)

> det 0이 될 수 있는 열들이 여러개라면 많은 경우의 수가 발생하지만 Case 별로 다 넣어서 머신러닝 돌려보고 판단 해야 함. 

> 차원 축소를 할 때 비지도 학습을 사용한다.  

A = df[['CRIM','NOX','NOX']]
AtA=A.T@A
np.linalg.det(AtA)

B=df[['CRIM', 'NOX']]
B['NOX3'] = B['NOX']*3
BtB = B.T@B
np.linalg.det(BtB)

 

> 0에 수렴하는 값. 

 

> 2x2 역행렬 공식에 행렬식이 들어가고 행렬식이 0이 되면 역행렬을 못 구한다. 

> 역행렬을 구해야 되는 이유는 회귀분석 Solution 구할 때 필요함.

> 행렬식이 0이면 에러가 나와야 되는데 코드 실행 시 조치가 되어있어 에러는 나지 않음

> 역행렬이 존재하지 않는 경우 singular matrix 

 

Y = df['MEDV']

XtX_inv = np.linalg.inv(XtX) #lialg : linear algebra
XtY = X_t@Y
XtX_inv @ XtY #회귀분석 Solution

 

> (X^TX)^1X^TY : 회귀분석 Solution (5x506 506x5 5x506 506x1) = 5x1 

> vector * vector^T 는 행렬이다

> vector^T * vector 는 스칼라이다. 

학습 목표 : 논문 발췌문 다 이해, 어디 내적 되었는지 찾아보기 

 

> 내적 (Inner Product) 은 벡터를 연산해서 스칼라 결과 값이 나오는 연산자. 

> 표기 방법은 <> or 가운데 º 을 사용한다. 

> 같은 위치이 있는 값들을 곱해서 더한 값

> 다른 표현 방식으로 앞의 벡터의 Transpose와 벡터의 곱 즉 결과는 스칼라. 

 

> 예를 들어 의자를 끌 때 내적의 값은 물체의 이동거리

> 내적이 0보다 작으면 의자가 뒤로 간다는 의미.

> 두 vector의 직각 여부를 판단할 때 사용된다. 

> 물리 관점으로 만약 좌표가 (2,3)에 공이 있고 (1,2) 내적 하면 값은 8이고 이 값의 뜻은 x축 2 위치에 1만큼 힘을 가하고

> y축 방향 3에 2의 힘을 적용한 후 모두를 더한 값이다. 

> 최종 위치는 2차원 좌표 대신 8이되며 이는 (2,3) 벡터 방향으로 8 만큼 움직였다는 뜻이다. 

 

> 노름 (norm) 표시는 vector의 크기를 계산한다. 

> 각각의 원소들을 제곱해서 Root 값 계산한다.

 

> 사이 각도를 구할 수 있다.

 

> 각도가 작은 vector 일수록 내적 값은 크다 

> 머신러닝 관점에서 내적 값이 클수록 vector들이 더 유사하다, 추천 시스템을 만들 때 사용된다. 

> 추천 시스템은 선형대수라고 봐도 무방하다. 

 

> cos 유사도도 다른 개념이 아닌 내적이다. 

> 공식에 Scaler 와 Core Function이 나눠져 있음 Scaler는 단위를 조정해 주는 값, Core Function이 중요한 식.

> cos 유사도에서 Core Function은 내적이다. 

 

crim = df['CRIM']
nox = df['NOX']
res = np.inner(crim,nox)
print(res)

 

 

> 수직인 vector를 직교 vector라고 한다. (Orthogonal Vector)

> 두 Vector가 직교 하면서 크기가 1인 vector를 정규 직교 벡터라고 한다. (Orthonormal Vector)

> 선형대수에서 Orthogoal Vector를 찾는 걸 선호한다 왜냐하면 내적이 0으로 계산이 필요 없기 때문이다.

 

> 1차원에서 1개의 좌표 필요, 2차원에선 2개 그리고 3차원에선 3개 필요함. 

 

> unit vector는 크기가 1이고 기본이 되는 Vector.

> unit vector로 3차원 모든 좌표를 표현 가능하고 이것을 선형 조합이라고 한다. 

> 선형 조합을 표현하는 i, j, k를 기저 벡터(basis vector)라고 한다.

 

> 전체 공간의 일부분 공간을 부분 공간이라고 한다. 

> 부분 공간이 2차원이면 기저 벡터는 2개이다 s1, s2. 

> 기저 벡터 2개 s1, s2로 부분 공간을 만들 수 있다 이것을 span 한다라고 표현한다.

 

> 2차원 (2,1)를 행렬을 곱해서 3차원으로 변환하는걸 선형 변환이라고 한다. 

 

> 기저 벡터로 선형 조합을 표현할 수 있다. 

> 하지만, 서로 기저 벡터로 만들 수 없으면 선형 조합을 할 수 없고 이것을 선형 독립이라고 한다.

 

> 선형 종속은 선형 조합으로 표현할 수 있다. 

> 행렬 안에 선형 종속이 있으면 행렬식은 0이다.

 

> 기저 벡터는 공간을 생성하는 선형 독립인 벡터들.

> 조건은 공간의 모든 좌표를 표현할 수 있어야 하고 선형 독립이어야 한다. 

 

> 기저 벡터는 항상 직교일 필요는 없으며 유일하지 않아도 된다.

> unit vector일 필요는 없다.

> 하지만 보통 직교를 사용한데 왜냐하면 내적이 0이어서 계산이 용이하기 때문.

 

> a)의 의미는 2차원 공간에 벡터 두 개가 있는데 추가로 하나가 더 있으면 기존 두 개로 나머지를 표현 가능하기 때문에 선형 종속이다. 

> b) 2차원에서 하나의 벡터가 있으면 공간 표현을 할 수 없다

> c) 2차원에서 색깔 별 기저 벡터를 여러 가지로 해도 총개수는 2개이다.

 

 

 

> 행으로  자른 2차원 vector가 3개로 만든 공간은 2차원이고 행 공간.

> 열로 자른 3차원 vector가 2개로 만든 공간은 2차원 왜냐하면 vector가 2개이기 때문에 이 공간을 열공 간.

> 그래서 rank는 2다.

> 열, 행의 기저 벡터 max 값으로 rank를 구할 수 있다. 종속 벡터는 rank에 포함되지 않는다.

> 머신 러닝에서 rank가 많았으면 좋겠지만 종속 벡터들이 있다면 rank는 예상보다 작아지게 된다. 

> 최대 나올 수 있는 rank를 Full rank라고 하고 rank는 feature의 개수가 된다. 

> Full rank가 아닌 경우 종속 벡터가 있기 때문에 A_TA의 행렬식은 0이다. 

 

 

> feature의 개수 4개 의 rank 가 3 이면 1이 남는데 이게 nullity 다.

> rank는 망대, nullity는 망소

> 영 공간은 쓸모없는 버려지는 공간

> 영 공간은 Ax 벡터 앞에 행렬이 있으면 선형 변환, 다른 공간으로 보내 버리고 보내는 공간이 0 임. 

 

> 기본 연산을 해줘도 행 공간, 열 공간은 변하지 않는다. 

 

> X를 다른 차원으로 보내버릴 때 (Linear Transformation) 자기 자신이 나오는 vector (길이만 바뀐)

> 이때 안 변환 vector를 고유 벡터라고 한다. 

> 람다를 고윳값이라고 한다, 고윳값은 스칼라, eigenvalue (하나의 고유한의 독일어)

> 고윳값이 0보다 작으면 반대로 커진다. 

 

> det 가 0인 것은 두 벡터가 포개지게 되고 하나의 해가 아닌 무한개의 해를 가지며 이는 종속 관계가 된다. 

 

> 미지수가 2개인데 해가 하나인 경우 => 부정 방정식

> 무한개의 해가 나온다. 

> 고유 벡터 두 개가 orthogonal 하지 않지만 orthogonal 되는 경우도 있다 대칭 행렬의 경우

> X^TX는 공분산 행렬, 대칭 행렬이다 그래서 이 행렬의 고유 벡터는 orthogonal이다. 

> 고윳값은 고유 벡터의 길이 

> 그럼 고윳값, 고유 벡터는 뭐 때문에 구하냐?

> 공분산 행렬은 데이터의 흩어짐 정도와 관련이 있다.
> 공분산 행렬, 고윳값, 고유 벡터를 구하게 되면  차원 축소가 가능하다. 

> 고유 벡터는 흩어짐의 방향, 고윳값은 흩어짐의 크기 

> 대칭 행렬이기 때문에 orthogonal 하다.

> 비지도 학습에서 라벨링이 안되어있기 때문에 구분하기 위해선 데이터의 흩어짐 정도가 중요하다. 

> 흩어짐 정도를 고유 벡터와 고윳값으로 표현할 수 있다.

 

> 2차원은 기저 벡터가 2개이고 차원 축소를 하려면 기저 벡터를 하나 줄여야 한다. 

> 대체로 1번을 뽑는다 이유는 길이가 길기 때문(Information Loss 때문)

> Information Loss는 경향 라인에 투사시켰을 때 원래 어디서 왔는지 1번일 때 더 잘 알 수 있다

> 2번은 길이가 길고 많기 때문에 원래 어디 있었는지 알 수 없는 경우가 많이 생긴다.

> 그래서 선택할 때 고윳값이 큰 것부터 한다. 

> 컴퓨터로 고윳값을 구하는데 여러 알고리즘이 있다. (빠르게 구하기 위해) 

 

> 행렬을 대각 행렬을 만드는 것을 대각화라고 한다.

> 가역 행렬 (Invertible Matrix)은 역행렬이 존재하는 행렬이다.

> A가 대칭 행렬이고 P가 직교 행렬이면 직교 대각화라고 한다. 

> 직교 행렬은 행렬의 벡터가 직교하는 행렬

> 대칭 행렬은 공분산 행렬과 관련 있다

>> 직교 행렬의 열 벡터들의 내적은 0이다. 

>> 직교 행렬이 대칭 행렬인 경우도 있지만, 일반적으로는 그렇지 않다.

> 이것을 고윳값 분해라고 한다.

> feature가 많은 고차원 행렬을 저차원 행렬로 분리하는 기법이다.

 

 

> 직교 행렬이면 역행렬이 Transpose 

 

 

> 고윳값은 내림차순 람다 1이 제일 큼

> 2차원 차원 축소 시 람다 1, 람다 2를 뽑는다. 

> 고윳값 분해는 직사각 행렬만 넣어야 한다.

X= df[['CRIM', 'NOX','RM','AGE','TAX']]
X_t = X.T
XtX = X_t@X

e, v = np.linalg.eig(XtX)

 

> 직사각 행렬이 아닐 때 고윳값 분해 가능하도록 한 일반적인 분해 방법

 

> 정사각 행렬로 만듦 

 

> P, P^T 대신 AA^T, A^TA를 사용

> 주의할 점은 AA^T의 값이 매우 크기 때문에 numpy에서 error가 나올 수 있다.  

> 고윳값 분해랑 특이값 분해가 거의 같은 내용이고 안전성이 더 뛰어난 고윳값 분해를 추천. 

X_t = X.T
XtX = X.T @ X
e, v = np.linalg.eig(XtX)
u,s, vt = np.linalg.svd(XtX)
u2,s2, vt2 = np.linalg.svd(X)

 

 

> 텐서는 Matrix가 모인 것 그림의 RGB 세 개의 Matrix가 필요하고 이미지 딥러닝 할 때는 텐서를 잘 다뤄야 한다. (CNN)

> 요즘 Deep learning Trend는 Tensor flow보다 Pytorch가 관심도가 더 높음. 

 

Ref : https://losskatsu.github.io/categories/#

반응형

'Machine Learning 입문' 카테고리의 다른 글

6. 확률 분포 & 가설 검정  (0) 2024.12.26
5. 데이터 전처리 처리 및 시각화  (1) 2024.12.26
4. 기초 통계 & 시각화  (2) 2024.12.26
2. 기초 수학  (0) 2024.12.24
1. 가상 환경 Setting / Jupyter Notebook  (0) 2024.12.24
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함