-
Notifications
You must be signed in to change notification settings - Fork 0
/
PCA.py
55 lines (49 loc) · 1.79 KB
/
PCA.py
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import numpy as np
import matplotlib.pyplot as plt
class PCA:
def __init__(self, X):
self.X=X
def SVDdecompose(self):
B = np.linalg.svd(self.X,full_matrices=False)
self.lamda=lamda=B[1]
self.P = B[2].T
self.T = B[0]*B[1]
compare=[lamda[i]/lamda[i+1] for i in range(len(lamda)-1)]
cum=lamda.cumsum()/lamda.sum()*100
return compare,cum
def PCAdecompose(self,k):
# 给定主成分数k,得到去处噪声后的得分T和载荷P
T = self.T[:,:k]
P = self.P[:,:k]
return T,P
def plotScore(self,types,xAxis=0,yAxis=1,inOne=False,syms=['r^','g+','b*','k-','md']):
classIds=[]
for i in types:
if not i in classIds:
classIds.append(i)
for i,oneId in enumerate(classIds):
plt.plot(self.T[types==oneId,xAxis],self.T[types==oneId,yAxis], syms[i],label='c'+str(i))
plt.legend(loc="upper left")
if not inOne:
plt.figure(2)
maxScoreX=max(abs(self.T[:,xAxis]))
maxScoreY=max(abs(self.T[:,yAxis]))
maxLoadingX=max(abs(self.P[:,yAxis]))
maxLoadingY=max(abs(self.P[:,yAxis]))
# 画载荷的贡献图
ratioInX= maxScoreX/maxLoadingX
ratioInY=maxScoreY/maxLoadingY
if (ratioInX>ratioInY):
arfa=ratioInY
else:
arfa=ratioInX
i=0
for row in self.P:
x=row[0]*arfa
y=row[1]*arfa
oneVariable=np.array([[0.0,0.0],[x,y]])
plt.plot(oneVariable[:,0],oneVariable[:,1],label=str(i))
plt.annotate(str(i), xy=(x, y), xycoords='data', xytext=(+1, +1),
textcoords='offset points', fontsize=16)
i = i+1
plt.show()