2-10. 고윳값과 고유벡터 찾기
고유벡터: 정방 행렬 A를 선형 변환으로 봤을 때, 선형 변환 A에 의한 변환 결과가 자기 자신의 상수 배가 되는 0이 아닌 벡터
고유값: 이때의 상수배 값
Av: v라는 열 벡터에 선형 변환 A를 해주었다
Av = λv: v라는 열 벡터에 선형 변환 A를 해준 결과가 열 벡터v의 상수 배(λ)와동일
즉, 벡터 v에 대해 선형 변환 A를 해주었을 때, 벡터 v의 방향은 변하지 않고 크기만 변함
그림 2)는 그림 1)을 선형변환한 것
파란색 화살표는 크기는 변했지만 방향은 그대로이므로 변한 크기 비율인 λ를 고유값으로하는 고유벡터
분홍색 화살표도 방향은 그대로이며 크기도 그대로이므로 λ=1인 고유벡터
빨간색 화살표는 방향과 크기가 모두 변했으므로 고유벡터가 아님
고유벡터의 성질로 det(A - λI)=0이어야하며 이를 이용해 고유값과 고유벡터를 구할 수 있음
A는 주어진 행렬
λ는 구해야하는 고유값
I는 A와 같은 크기의 단위행렬
행렬식을 이용해 λ를 구하면 Av = λv식에 λ를 대입하여 v 구하기
파이썬에서는 linalg.eig 함수 사용
import numpy as np
matrix=np.array([[1, -1, 3],
[1, 1, 6],
[3, 8, 9]])
eigenvalues, eigenvectors=np.linalg.eig(matrix)
print('고유값: ', eigenvalues)
print('고유벡터: ', eigenvectors)
### 결과 ###
고유값: array([13.55075847, 0.74003145, -3.29078992])
고유벡터: array([[-0.17511017, -0.96677403, -0.53373322],
[-0.435951 , 0.2053623 , -0.64324848],
[-0.88254925, 0.15223105 , 0.54896288]])
대칭행렬일 경우 np.linalg.eigh(matrix)를 사용하면 더 빨리 계산(대칭행렬 여부를 확인하지는 않음)
2-11. 점곱 계산하기
점곱은 행렬의 같은 위치의 성분끼리 곱해준 것
import numpy as np
vector_a=np.array([1,2,3])
vector_b=np.array([4,5,6])
np.dot(vector_a,vector_b)
### 결과 ###
32
# np.dot 대산에 @를 사용할 수도 있음
vector_a @ vector_b
### 결과 ###
32
vector_a와 vector_b의 점곱은 1×4 + 2×5 + 3×6=32
2-12. 행렬 곱셈
행렬의 곱셈
첫번째 행렬 첫번째 행 × 두번째 행렬 첫번째 열 첫번째 행렬 첫번째 행 × 두번째 행렬 두번째 열
첫번째 행렬 두번째 행 × 두번째 행렬 첫번째 열 첫번째 행렬 두번째 행 × 두번째 행렬 두번째 열
파이썬에서는 np.dot사용
import numpy as np
matrix_a=np.array([[1,1],
[1,2]])
matrix_b=np.array([[1,3],
[1,2]])
np.dot(matrix_a,matrix_b)
### 결과 ###
array([[2,5],
[3,7]])
# np.dot 대신에 @ 사용 가능
matrix_a @ matrix_b
### 결과 ###
array([[2,5],
[3,7]])
# 원소별 곱셈을 하려면 * 사용
matrix_a * matrix_b
### 결과 ###
array([[1,3],
[1,4]])
※ np.dot과 np.matmul의 차이
-(a,b,c,D) 크기의 4차원 배열은 c행 D열의 행렬 b개의 있는 행렬이 a개 있는 행렬
-(e,f,D,h)크기의 4차원 배열은 D행 h열의 행렬 f개 있는 행렬이 e개 있는 행렬
-np.dot은 (a,b,c,D) 크기의 배열과 (e,f,D,h) 크기의 배열의 곱셈의 결과로 (a,b,c,e,f,h)크기의 배열을 만듦
-@(np.matmul)는 (a,b,c,D) 크기의 배열과 (e,f,D,h) 크기의 배열의 곱셈의 결과로 (a',b',c,h)크기의 배열을 만듦
→a와 e는 같거나 둘 중 하나는 1, b와 f는 같거나 둘 중 하나는 1이어야 함
→a'와 b'는 각각 a와 e, b와 f 중 1이 아닌 값
2-13. 역행렬
정방행렬의 역행렬은 정방행렬과 곱했을 때 단위행렬 I가 되는 행렬
파이썬에서는 np.linalg.inv 사용
import numpy as np
matrix=np.array([[1,4],
[2,5]])
np.linalg.inv(matrix)
### 결과 ###
array([[-1.66666667, 1.33333333],
[ 0.66666667, -0.33333333]])
# 행렬과 역행렬을 곱하면 대각원소가 전부 1이고 나머지 원소는 0인 단위행렬이 나옴
matrix @ np.linalg.inv(matrix)
### 결과 ###
array([[1., 0.],
[0., 1.]])
정방행렬이 아닌 행렬의 역행렬을 유사 역행렬이라고 부르며 계산할 수 있음, np.linalg.pinv() 사용
import numpy as np
matrix=np.array([[1,4,7],
[2,5,8]])
np.linalg.pinv(matrix)
### 결과 ###
array([[-1.6666667, 1.],
[-0.3333333, 0.3333333],
[ 0.5 , -0.3333333]])
'Python > 기본문법' 카테고리의 다른 글
데이터 랭글링 (2) (0) | 2023.06.26 |
---|---|
데이터 랭글링 (1) (0) | 2023.06.23 |
데이터 적재 (0) | 2023.06.22 |
Numpy로 배열, 벡터, 행렬 이해하기 (2) (0) | 2022.10.19 |
Numpy로 배열, 벡터, 행렬 이해하기 (1) (0) | 2022.10.17 |