PCA-python实现综合评价求解-续
这个是接着前面写的一篇,链接在下面,数据集也有:
上一篇博客点击此处跳转
k是我们选择的主成分数量,我们最终会根据该主成分数量,得到我们的评价指标,我加入了写入功能可以将评价指标数据写入excel文件,完整代码如下:
import numpy as np
def pca_tre(Mat, k):
p,n = np.shape(Mat) # shape of Mat
t = np.mean(Mat, 0) # mean of each column
# substract the mean of each column
for i in range(p):
for j in range(n):
Mat[i,j] = float(Mat[i,j]-t[j])
# covariance Matrix
cov_Mat = np.dot(Mat.T, Mat)/(p-1)
# PCA by original algorithm
# eigvalues and eigenvectors of covariance Matrix with eigvalues descending
U,V = np.linalg.eigh(cov_Mat) #U 是特征值
index = np.argsort(-U)
if k > n:
print("k must lower than feature number")
return
else:
selectVec = np.matrix(V.T[index[:k]])
finalData = Mat * selectVec.T
return finalData,U#主成分
import pandas as pd
data=pd.read_excel(r"C:\Users\gaoxi\Desktop\data.xlsx")
#print(data.iloc[:, 1:].values)
data=data.iloc[:, 1:].values
k=2
finalData,u=pca_tre(data,k)
sum=0
u.sort()
u=u[::-1]
u_sum=np.sum(u)
for i in range(2):
sum=sum+u[i]/u_sum
print("sum : ",sum)
def score_get(finalData,u,k):
u.sort()
u=u[::-1]
u_sum=np.sum(u)
# print(u_sum)
score=[]
for i in range(len(u)):
u[i]=u[i]/u_sum
#print(u)
for i in range(len(finalData)):
# print(finalData[i])
c = []
for x in finalData[i].flat:
c.append(x)
# print("score:",np.dot(u[:k],c))
score.append(np.dot(u[:k],c))
return score
score=score_get(finalData,u,k)
data=score
path="C:/Users/gaoxi/Desktop/"
#Excel数据
import xlwt
#生成xls工作薄
wb = xlwt.Workbook()
wb.add_sheet('first_sheet', cell_overwrite_ok=True)
wb.get_active_sheet()
ws_1 = wb.get_sheet(0)
print(data)
for c in range(len(data)):
ws_1.write(c, 0, data[c])
wb.save(path + 'workbook.xls')
print(score)
如下是上述代码得到的评价指标数据: