[PCA] 주성 분 분석 알고리즘
6757 단어 MathModeling
기본 사상
예 를 들 어 각 과목 의 성적 에 서로 다른 가중치 를 부여 하고 차례대로 학생 의 총 성적 을 구분한다.학생 의 성적 을 구분 하 는 것 은 전체 성적 의 방 차 를 더욱 크게 하 는 것 을 의미한다.x1, x2,.................................................................................X1, X2, X3,............................................................................이때 문 제 는 더욱 명확 해 졌 다.
find C=[c1,c2,c3,c4......cp]
to maximize Var(c1X1+c2X2+c3X3+.....+cpXp)
그러나 이러한 해 는 무한 개 입 니 다. 일반적으로 제한 조건 을 추가 합 니 다: c21 + c22 + c23 + c24... c2p = 1
C 를 얻 을 때마다 주성 분 치 Z 를 얻 고 C 벡터 마다 교차 합 니 다.주성 분 으로 주성 분 간 에는 관계 가 없 을 것 이기 때문이다.
다른 각도
만약 에 우리 가 k 개의 주성 분, 행렬 Zn, k 를 내 려 간 데이터 로 하고 행렬 Xn, d 는 원시 적 인 n 조 d 차원 데이터, 행렬 Pd, k 는 k 열 주성 분 을 나타 낸다.그러면 Z = XP 가 있 습 니 다. 이때 P 의 k 열 벡터 가 교차 합 니 다.Z 는 처리 할 데이터 로 서 Z 의 각 feature 간 에 정 교 를 유지 해 야 한다.그래서 ZTZ = PTXT XP 는 대각 행렬 이다.그래서 문 제 는 행렬 P 를 구하 여 XTX 를 대각 화 하 는 것 으로 간략화 되 었 다.실제 대칭 행렬 이기 때문에 P 는 반드시 존재 합 니 다.
통계학 적 으로 매트릭스 ZTZ.Var(Z1)=1n∑ni=1(zi1−μ1) 2 모든 데이터 평균치 가 0 이면 Var (Z1) = 1n ∑ ni = 1 (zi1) 2 Cov (Z1, Z2) = 1n ∑ ni = 1 (zi1zi 2)
그래서
1nZTZ=⎡⎣⎢⎢⎢σ11σ21.σk1σ12σ22.σk2σ13σ23.σk3.......σk4σ1kσ2k.σk5⎤⎦⎥⎥⎥
이루어지다
주성 분 회귀 분석의 실현.
번호
x1
x2
x3
x4
y
1
7
26
6
60
78.5
2
1
29
15
52
74.3
3
11
56
8
20
104.3
4
11
31
8
47
87.6
5
7
52
6
33
95.9
6
11
55
9
22
109.2
7
3
71
17
6
102.7
8
1
31
22
44
72.5
9
2
54
18
22
93.1
10
21
47
4
26
115.9
11
1
40
23
34
83.8
12
11
66
9
12
113.3
13
10
68
8
12
109.4
#!usr/bon/env python
#-*- coding:utf-8 -*-
import numpy as np
data = np.array([[7, 26, 6, 60],\
[1, 29, 15, 52],\
[11, 56, 8, 20],\
[11, 31, 8, 47],\
[7, 52, 6, 33],\
[11, 55, 9, 22],\
[3, 71, 17, 6],\
[1, 31, 22, 44],\
[2, 54, 18, 22],\
[21, 47, 4, 26],\
[1, 40, 23, 34],\
[11, 66, 9, 12],\
[10, 68, 8, 12]])
y = np.array([78.5, 74.3, 104.3, 87.6, 95.9, 109.2, 102.7,\
72.5, 93.1, 115.9, 83.8, 113.3, 109.4])
#regularation
c = (y - np.mean(y))/np.std(y)
sd = np.std(data, axis=0)
avg = np.mean(data, axis=0)
data = data - avg
data /= sd
x = np.dot(data.T, data)
x /= 13
# x =
#array([[ 1. , 0.22857947, -0.82413376, -0.24544511],
# [ 0.22857947, 1. , -0.13924238, -0.972955 ],
# [-0.82413376, -0.13924238, 1. , 0.029537 ],
# [-0.24544511, -0.972955 , 0.029537 , 1. ]])
#
eigval, eigvec = np.linalg.eig(x)
z = np.dot(data, eigvec[:,:3])
a = np.dot(z.T,z)
b = np.dot(z.T,c)
np.linalg.solve(a,b)
# array([ 0.65695805, -0.00830863, 0.30277024])
eival 은 array ([2.23570403e + 00, 1.57606607 e + 00, 1.86606149 e - 01, 1.62374573 e - 03]) 로 마지막 특징 치가 매우 작 음 을 알 수 있 으 며 큰 것 부터 작은 것 까지 세 가지 특징 치 를 선택 하여 분석 하면 된다.이 세 가지 특징 치 로 형 성 된 누적 기여 율 은 99.96% 의 특징 벡터 는 array ([0.47595517, 0.50897938, 0.67550019, 0.24105218], [0.56387024, - 0.41393149, - 0.31442044, 0.64175607], [- 0.3940 6653, - 0.6496908, 0.63769109, 0.26846611], [- 0.54793119, 0.45123511, - 0.19542096, 0.67673402]) 이 므 로 보존 해 야 할 특징 벡터 는 array ([- 0.54793919, 0.451235111, - 0.19542096, 0.67673402]) 이다.[ 0.47595517, 0.50897938, 0.67550019], [ 0.56387024, -0.41393149, -0.31442044], [-0.39406653, -0.60496908, 0.63769109], [-0.54793119, 0.45123511, -0.19542096,])
진짜 좋 을 것 같 아.
y′=0.513x′1+0.279x′2−0.061x′3−0.423x′4