一、观察数据
数据由旷课次数、迟到次数、早退次数等多个指标组成。而我们需要做的pca则是需要将众多数据结合起来提取出主要的几个主成分。
二、实现过程
import pandas as pd
import numpy as np
import random
import math
import matplotlib.pyplot as plt
df = pd.read_excel('平时成绩模拟数据.xls')
# print(df)
data = np.array(df)
#k为想要的主成分个数
k = 3
#零均值化
mean = np.mean(data,axis = 0)
data = data - mean
#计算协方差矩阵
n_sample,n_feature = data.shape
cov = np.dot(data.T,data)/(n_sample - 1)
#计算特征值和特征向量
vals,vecs = np.linalg.eig(cov)
#从小到大输出特征值索引
rank = np.argsort(vals)
#取前k个最大的特征值索引
rank = rank[:-(k+1):-1]
#取对应的特征向量
rankvecs = vecs[:,rank]
# print(rankvecs)
new_data = data.dot(rankvecs)
# print(new_data)
print('选取了{}个主成分'.format(k))
print('总贡献率为:{:.2%}'.format(np.sum(vals[rank])/np.sum(vals)))
# print('降维后的数据如下:',new_data)
## 绘制贡献率图像
tot=np.sum(vals) # 计算特征值的和
var_exp=[(i / tot) for i in sorted(vals,reverse=True)] # 按照降序排列特征值,并计算贡献率
cum_var_exp=np.cumsum(var_exp) #累计贡献度
plt.bar(range(1,len(var_exp)+1),var_exp,alpha=0.5,align='center',label='individual var') # 绘制柱状图,
plt.step(range(1,len(var_exp)+1),cum_var_exp,where='mid',label='cumulative var') # 绘制阶梯图
plt.ylabel('variance rtion') # 纵坐标
plt.xlabel('principal components') # 横坐标
plt.legend(loc='right') # 图例位置,右下角
plt.show()
#排序特征值
rank_RV = np.argsort(vals)
rank_RV = rank_RV[::-1]
#取对应的特征向量
Q = vecs[:,rank_RV]
#计算rv系数
B = np.dot(Q,data.T)
A = data.T
RV = np.trace(A.T.dot(A).dot(B.T).dot(B))/math.sqrt( np.trace( A.T.dot(A).dot(A.T).dot(A) ) * np.trace( B.T.dot(B).dot(B.T).dot(B) ))
print('RV系数为:',RV)
三、输出和可视化结果