2-10. 고윳값과 고유벡터 찾기

고유벡터: 정방 행렬 A를 선형 변환으로 봤을 때, 선형 변환 A에 의한 변환 결과가 자기 자신의 상수 배가 되는 0이 아닌 벡터

고유값: 이때의 상수배 값

Av: v라는 열 벡터에 선형 변환 A를 해주었다

Av = λv: v라는 열 벡터에 선형 변환 A를 해준 결과가 열 벡터v의 상수 배(λ)와동일

               즉, 벡터 v에 대해 선형 변환 A를 해주었을 때, 벡터 v의 방향은 변하지 않고 크기만 변함

그림 1) 출처: 공돌이의 수학정리노트 유튜브
그림 2) 출처: 공돌이의 수학정리노트 유튜브

그림 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

+ Recent posts