#自定义函数编制PCA程序
from numpy import *
#通过方差百分比来计算数据降到多少维
def eigValPct(eigVals,percentage):#特征值,方差百分比
sortArray=sort(eigVals)#从小到大
sortArray=sortArray[-1::-1]#从大到小
arraySum=sum(sortArray)
tempSum=0
num=0
for i in sortArray:
tempSum+=i
num+=1
if tempSum>=percentage*arraySum:
return num
def pca(dataMat,percentage=0.9):
meanVals=mean(dataMat,axis=0)#每一列求平均值,因为协方差的计算需要减去均值
meanRemoved=dataMat-meanVals
covMat=cov(meanRemoved,rowvar=0)#计算方法
eigVals,eigVects=linalg.eig(mat(covMat))#求特征值和特征向量
k=eigValPct(eigVals,percentage)
eigValInd=argsort(eigVals)#特征值从小到大排序
eigValInd=eigValInd[:-(k+1):-1]#排好序的特征值,从后往前取k个
redEigVects=eigVects[:,eigValInd]#对应的特征向量(主成分)
lowDDataMat=meanRemoved*redEigVects#将原始数据投影到主成分上得到新的低维数据
reconMat=(lowDDataMat*redEigVects.T)+meanVals #重构数据
return lowDDataMat,reconMat
data=pd.read_excel('/data.xls',header=None)
dataMat=mat(data)
pca(dataMat,percentage=0.9)


from numpy import *
import pandas as pd
import matplotlib.pyplot as plt
def pca(dataMat,topNfeat=999999):
meanVals=mean(dataMat,axis=0)#每一列求平均值,因为协方差的计算需要减去均值
meanRemoved=dataMat-meanVals
covMat=cov(meanRemoved,rowvar=0)#计算方法
eigVals,eigVects=linalg.eig(mat(covMat))#求特征值和特征向量
eigValInd=argsort(eigVals)#特征值从小到大排序
eigValInd=eigValInd[:-(topNfeat+1):-1]#排好序的特征值,从后往前取k个
redEigVects=eigVects[:,eigValInd]#对应的特征向量(主成分)
lowDDataMat=meanRemoved*redEigVects#将原始数据投影到主成分上得到新的低维数据
reconMat=(lowDDataMat*redEigVects.T)+meanVals #恢复数据
return lowDDataMat,reconMat
data=pd.read_csv("/testSet.txt",sep='\t',header=None)
dataMat=mat(data)
lowDMat,reconMat=pca(dataMat,1)
fig=plt.figure()
ax=fig.add_subplot(111)
ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',s=90)
ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='o',s=50,c='red')
plt.show()

&spm=1001.2101.3001.5002&articleId=103817147&d=1&t=3&u=ac52dfedc9134ff5bb2b8be5e287c93d)
4万+

被折叠的 条评论
为什么被折叠?



