Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- Media Mix Modeling
- 수리통계
- bayesian inference
- Optimization
- 시계열분석 #Time-Series Analysis #이상탐지 #Anomaly Detection #Spectral Residual #CNN #SR-CNN
- 프로그래머를 위한 선형대수 #선형대수 #고유값 #고유벡터 #고유분해
- 프로그래머를 위한 선형대수 #선형대수 #고유분해 #고윳값 #고유벡터
- 미적분 #접선의 방정식 #최적화 #뉴턴법 #뉴턴-랩슨법
- 미적분 #평균값 정리 #로피탈의 정리 #접선의 방정식
- lightweightmmm
- Marketing Mix Modeling
- 프로그래머를 위한 선형대수 #선형대수 #LU분해
- bayesian
- 미적분
- mmm
- 미적분 #사인과 코사인의 도함수
- 프로그래머를 위한 선형대수 #선형대수 #고유값 #고유벡터 #야코비 회전법 #QR법 #하우스홀더반사 #행렬회전
- 프로그래머를 위한 선형대수 #선형대수 #행렬계산
Archives
- Today
- Total
문과생 네버랜드의 데이터 창고
8. 고유값의 활용 본문
In [310]:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
from matplotlib import gridspec
import pandas as pd
1. 상태지수¶
1) 정의¶
In [291]:
X = np.matrix([[4,2,3],[4,2,3],[6,7,0]])
print(X)
[[4 2 3] [4 2 3] [6 7 0]]
In [292]:
#평균을 빼 중심화 해준다.
X = X - np.mean(X,axis=1)
print(X)
[[ 1. -1. 0. ] [ 1. -1. 0. ] [ 1.66666667 2.66666667 -4.33333333]]
In [293]:
#공분산 행렬을 구해준다.
X_corr = np.matmul(X,X.T)/2
print(X_corr)
[[ 1. 1. -0.5 ] [ 1. 1. -0.5 ] [-0.5 -0.5 14.33333333]]
- 이 상관행렬의 고유분해를 실시한다.¶
In [294]:
X_corr_eig = np.linalg.eig(X_corr)
X_corr_eig
Out[294]:
(array([-2.22044605e-16, 1.95959185e+00, 1.43737415e+01]), matrix([[-7.07106781e-01, 7.05955024e-01, -4.03423318e-02], [ 7.07106781e-01, 7.05955024e-01, -4.03423318e-02], [ 1.63450702e-17, 5.70526728e-02, 9.98371170e-01]]))
- 이 때, 고윳값의 총합은 데이터 X의 분산과 같고¶
In [295]:
sum(X_corr_eig[0])
Out[295]:
16.333333333333332
- 가장 큰값인 세번째 고윳값과, 첫번째 고윳값의 비율의 근은¶
In [296]:
(X_corr_eig[0][2]/X_corr_eig[0][0]) ** (1/2)
# 상태지수가 표현 가능한 자릿수를 넘어 nan이 표기된다.
C:\Users\never\Anaconda3\lib\site-packages\ipykernel_launcher.py:1: RuntimeWarning: invalid value encountered in double_scalars """Entry point for launching an IPython kernel.
Out[296]:
nan
(3) 시각적인 이해 - 과연 무슨 일이 일어나고 있나?¶
In [314]:
plt.figure(figsize = (20,20))
fig_1 = plt.subplot(2,2,1,projection="3d")
fig_2 = plt.subplot(2,2,2,title = "subspace at XY")
fig_3 = plt.subplot(2,2,3,title = "subspace at XZ")
fig_4 = plt.subplot(2,2,4,title = "subspace at YZ")
first = np.linspace(0,10,1000)
second = np.linspace(0,0,1000)
third = np.linspace(0,0,1000)
fig_1.plot3D(first,second,third,c="b")
fig_1.plot3D(second,first,third,c="b")
fig_1.plot3D(third,second,first,c="b")
fig_1.scatter3D(X[0,0],X[1,0],X[2,0],marker="o",c="g",label = "Vector X")
fig_1.scatter3D(X[0,1],X[1,1],X[2,1],marker="o",c="y",label = "Vector X")
fig_1.scatter3D(X[0,2],X[1,2],X[2,2],marker="o",c="b",label = "Vector X")
fig_2.scatter(X[0,0],X[1,0])
fig_2.scatter(X[0,1],X[1,1])
fig_2.scatter(X[0,2],X[1,2])
fig_3.scatter(X[1,0],X[2,0])
fig_3.scatter(X[1,1],X[2,1])
fig_3.scatter(X[1,2],X[2,2])
fig_4.scatter(X[0,0],X[2,0])
fig_4.scatter(X[0,1],X[2,1])
fig_4.scatter(X[0,2],X[2,2])
fig_1.view_init(20,20)
plt.show()
- 위 그래프를 살펴보면, XY 평면에선 변수들이 완전한 선형관계를 띄고 있음을 볼 수 있다. 즉, 변수 X와 Y는 상관관계가 매우 뚜렷하다.¶
- 위에서 도출한 데이터행렬 X의 상관행렬의 고유분해를 실시하면¶
In [285]:
X_corr_eig[1]
Out[285]:
matrix([[-7.07106781e-01, 7.05955024e-01, -4.03423318e-02], [ 7.07106781e-01, 7.05955024e-01, -4.03423318e-02], [ 1.63450702e-17, 5.70526728e-02, 9.98371170e-01]])
In [286]:
X_corr_eig
Out[286]:
(array([-2.22044605e-16, 1.95959185e+00, 1.43737415e+01]), matrix([[-7.07106781e-01, 7.05955024e-01, -4.03423318e-02], [ 7.07106781e-01, 7.05955024e-01, -4.03423318e-02], [ 1.63450702e-17, 5.70526728e-02, 9.98371170e-01]]))
In [316]:
plt.figure(figsize = (20,20))
fig_1 = plt.subplot(2,2,1,projection="3d")
first = np.linspace(0,7,1000)
second = np.linspace(0,0,1000)
third = np.linspace(0,0,1000)
fig_1.plot3D(first,second,third,c="b")
fig_1.plot3D(second,first,third,c="b")
fig_1.plot3D(third,second,first,c="b")
fig_1.scatter3D(X[0,0],X[1,0],X[2,0],marker="o",c="g",label = "Vector X")
fig_1.scatter3D(X[0,1],X[1,1],X[2,1],marker="o",c="y",label = "Vector X")
fig_1.scatter3D(X[0,2],X[1,2],X[2,2],marker="o",c="b",label = "Vector X")
x = np.linspace(0,X_corr_eig[1][0,0] * X_corr_eig[0][0],1000)
x_y = np.linspace(0,X_corr_eig[1][1,0]* X_corr_eig[0][0],1000)
x_z = np.linspace(0,X_corr_eig[1][2,0]* X_corr_eig[0][0],1000)
y_x = np.linspace(0,X_corr_eig[1][0,1]* X_corr_eig[0][1],1000)
y = np.linspace(0,X_corr_eig[1][1,1]* X_corr_eig[0][1],1000)
y_z = np.linspace(0,X_corr_eig[1][2,1]* X_corr_eig[0][1],1000)
z_x = np.linspace(0,X_corr_eig[1][0,2]* X_corr_eig[0][1],1000)
z_y = np.linspace(0,X_corr_eig[1][1,2]* X_corr_eig[0][1],1000)
z = np.linspace(0,X_corr_eig[1][2,2]* X_corr_eig[0][1],1000)
fig_1.plot3D(x,x_y,x_z,c="r")
fig_1.plot3D(y_x,y,y_z,c="r",alpha=0.5)
fig_1.plot3D(z_x,z_y,z,c="r")
fig_1.view_init(20,20)
plt.show()
'선형대수' 카테고리의 다른 글
10. 노름(Norm) (0) | 2023.07.13 |
---|---|
9. 행렬식과 여인수전개 (0) | 2023.06.12 |
7. 고윳값, 고유벡터 계산 알고리즘 (0) | 2023.05.03 |
6. 고유공간과 고유분해 (0) | 2023.05.03 |
5. LU 분해 (0) | 2023.05.03 |