对于主成分分析详细的介绍:主成分分析(PCA)原理详解https://blog.csdn.net/zhongkelee/article/details/44064401
import numpy as np
import pandas as pd'''标准PCA算法'''
def standeredPCA(data,N): #data:数据集DataFrame N:降维后需要的维数n=data.shape[1] #数据集data的列数,即维度m=data.shape[0] #数据集data的行数colname=list(data.columns) #提取列名AVG=[] #原始各个维度的平均值for i in range(n):avg=0s=list(data[colname[i]])num=len(s)for j in s:avg+=javg=avg/numAVG.append(avg)'''将每一列数据都转换成列表型'''df=[] #存储每一列的数据for i in range(n):ls=list(data[colname[i]])df.append(ls)'''数据中心化'''for i in range(n):t=df[i]for j in range(len(t)):t[j]=t[j]-AVG[i]'''求特征协方差矩阵'''A=np.zeros((n,n))for i in range(n):for j in range(n):p=df[i]q=df[j]for k in range(m):A[i][j]+=p[k]*q[k]A[i][j]=A[i][j]/(m-1)'''求协方差的特征值和特征向量'''B=np.linalg.eig(A)P=B.eigenvalues #特征值Q=B.eigenvectors #特征向量U=[index for index, value in sorted(list(enumerate(P)), key=lambda x:x[1])] #对特征值排序输出索引值序列U=sorted(U,reverse=True) #特征值从大到小排序的索引值u=[] #输出排在前N个的索引值for i in range(N):u.append(U[i])r=[] #需要的特征值t=[] #需要的特征向量for i in u:r.append(P[i])T=[]for j in Q:T.append(j[i])t.append(T)'''得到通过PCA后获得的N个特征的数据'''W=[] #存储通过PCA后得到的每一个特征的数据【列表】for i in range(N):a=[] #存储通过PCA的特征数据b=t[i]for j in range(m): #遍历数据的行f=0for k in range(n): #遍历数据的列f=f+df[k][j]*b[k]a.append(f)W.append(a)'''输出经过PCA降维处理后得到的N个特征数据'''fdata=pd.DataFrame(W)fdata=fdata.Tprint("经过PCA降维后得到的结果如下:")print(fdata)'''计算特征信息提取率'''sum=0for i in P:sum+=ifsum=0for i in u:fsum+=P[i]PCAprecent=fsum/sumprint("PCA数据特征的信息提取率是:{}".format(PCAprecent))if __name__=="__main__":df = {'x': [2.5, 0.5, 2.2, 1.9, 3.1, 2.3, 2, 1, 1.5, 1.1], 'y': [2.4, 0.7, 2.9, 2.2, 3.0, 2.7, 1.6, 1.1, 1.6, 0.9]}data = pd.DataFrame(df)standeredPCA(data, 1)