반응형
목차
1. 행렬
- 행렬(matrix)은 벡터를 원소로 가지는 2차원 배열
- 행렬은 행(row)와 열(column)이라는 인덱스(index)를 가짐
- 행렬끼리 같은 모양을 가지면 덧셈, 뺄셈을 할 수 있음
- 성분곱(스칼라곱)도 행렬과 똑같음
np.array([[1,2,3],
[4,5,6],
[7,8,9]])
- 전치행렬
- 행과 열의 정보가 바뀜
(이미지 출처: boostcourse AI Tech Precourse)
- 행렬 곱셈은 i번째 행벡터와 j번째 열벡터 사이의 내적을 성분으로 가지는 행렬을 계산
a = [[1,2],
[3,4]]
b = [[3,4],
[5,6]]
a * b =
[ [ 1*3+2*5, 1*4+2*6 ],
[ 3*3+4*5, 3*4+4*6] ]
= [ [13, 16],
[29, 36] ]
- 넘파이의 np.inner는 위의 행렬곱과는 다르게 i번째 행벡터와 j번째 행벡터 사이의 행렬곱을 계산 (x의 행의갯수와 y의 행의갯수가 같아야함)
a = [[1,2],
[3,4]]
b = [[3,4],
[5,6]]
np.inner(a,b)
-> [ [ 1*3+2*4, 1*5+2*6 ],
[ 3*3+4*4, 3*5+4*6 ] ]
= [ [ 11, 17 ],
[ 25, 39 ] ]
- 행렬은 벡터공간에서 사용되는 연산자(operator)로 이해한다
- 행렬곱을 통해 벡터를 다른 차원의 공간으로 보낼 수 있음
- 행렬곱을 통해 패턴을 추출할 수 있고 데이터를 압축할 수 있음
- 모든 선형변환(linear transform)은 행렬곱으로 계산할 수 있음
2. 역행렬(inverse matrix)
- 행과 열 숫자가 같고 행렬식(determinant)이 0이 아닌 경우에만 계산 가능
- 항등 행렬(I)는 A* A의 역행렬로 구함
a = [[1,2],
[3,4]]
#항등행렬과 유사한 값이나옴
np.linalg.inv(a)
- 역행렬을 계산할 수 없다면 유사역행렬(pseudo-inverse) 또는 무어-펜로즈(Moore-Penrose) 역행렬 A+ 를 사용함
- 행의 개수가 열의 개수보다 더 많다면 -> A의전치행렬 * A
- 열의 개수가 행의 개수보다 더 많다면 -> A * A의전치행렬
a = [[1,2],
[3,4],
[5,6]]
np.linalg.pinv(a)
# 행의 개수가 열의 개수보다 더 많을 때 유사역행렬
np.linalg.pinv(a) @ a
-> array([[ 1.00000000e+00, 6.66133815e-16],
[-3.88578059e-16, 1.00000000e+00]])
3. 응용 선형회귀분석
- XB = y에서 B를 찾기 위한 식
(이미지 출처: boostcourse AI Tech Precourse) - sklearn의 LinearRegression과 Moore-Penrose로 구한 역행렬(베타)의 값이 동일
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X,y)
y_test = model.predict(x_test)
# Moore-Penrose
X_ = np.array([np.append(x,[1]) for x in X]) # y절편(intercept) 항을 직접 추가
beta = np.linalg.pinv(X_) @ y
y_test = np.append(x, [1]) @ beta
반응형
'부스트캠프 AI Tech 2기 > Precourse' 카테고리의 다른 글
Pandas (1) (0) | 2021.07.25 |
---|---|
경사하강법 (1) (0) | 2021.07.22 |
벡터에 대해서 (0) | 2021.07.21 |
Numpy (0) | 2021.07.20 |
Python Data Handling (0) | 2021.07.19 |