主成分分析 python实现

主成分分析的步骤:

1.首先有一个原始数据阵X=[X1,X2,X3,X4]

2.对数据阵进行标准化,一般的标准化方法是Xi=(Xi-E(Xi))/\sigmai

3.求出新的矩阵X^{*}的协方差矩阵

4.求出X^{*}的特征值(从大到小排列)和特征向量

5.各主成分贡献度为\lambda _{i}/(\lambda _{1}+\lambda _{2}+\lambda _{3}+\lambda _{4})  ,其中\lambda _{i}是协方差矩阵的特征值

 

code如下:

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

li = pd.read_csv('student_date', header=None)
matrix = np.mat(li)
#print(matrix)

#矩阵标准化
average=np.mean(matrix,0)
average_matrix=matrix-average
for i in range(4):
    a=np.std(matrix[:,i])
    average_matrix[:,i]=average_matrix[:,i]/a
print(average_matrix)

#求协方差矩阵
cov_matrix=((average_matrix.T)*average_matrix)/29
print(cov_matrix)

#求特征值和特征向量
eigenvalue,eigenvector=np.linalg.eig(cov_matrix)
print(eigenvector)#4,4
print(eigenvalue)
print('各主成分贡献度:{}'.format(eigenvalue/(sum(eigenvalue))))

#可视化处理
X1,X2,X3,X4=average_matrix[:,0],average_matrix[:,1],average_matrix[:,2],average_matrix[:,3]
Z1 = 0.4970*X1+0.5146*X2+0.4803*X3+0.5074*X4
Z2 = 0.5442*X1-0.2031*X2-0.7287*X3+0.3627*X4
number=[x for x in range(1,31)]
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.title("Z2*Z1$number. Symbol used is '*'")
plt.xlabel("Z1")
plt.ylabel("Z2")
plt.plot(Z1,Z2,"*b")
for i in range(30):
    plt.annotate(number[i], xy = (Z1[i], Z2[i]), xytext = (Z1[i]+0.1, Z2[i]+0.1)) # 这里xy是需要标记的坐标,xytext是对应的标签坐标
plt.show()

 

result:

各主成分贡献度:[0.88445596 0.07869541 0.01674267 0.02010596]

你可能感兴趣的:(python编程)