PCA主成分分析+RV系数

一、观察数据

PCA主成分分析+RV系数_第1张图片

数据由旷课次数、迟到次数、早退次数等多个指标组成。而我们需要做的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)

三、输出和可视化结果

PCA主成分分析+RV系数_第2张图片

 

 

你可能感兴趣的:(python,机器学习,数据挖掘)