您的位置:首页 > 编程语言 > Python开发

PCA降维 python实现

2016-11-11 23:45 253 查看
主成分分析,Principal Component Analysis

计算协方差矩阵,由于是hermitian的,所以100%可正交对角化而且特征值一定非负

求出特征值特征向量以后,取特征值比较大的那几个方向构成线性空间,把数据投影上去就OK了

补详细公式推导:
http://blog.csdn.net/u013648367/article/details/73824049
import os
import numpy as np
import matplotlib.pylab as plt

def dataLoader(file):
return np.array([ i.split() for i in open(file)],dtype="float")

def pca(dataSet,rank=0):
means = np.mean(dataSet,axis=0)
dataSet = dataSet - means #去中心化 ,使得E(X),E(Y),... =0, 方便求方差
#plt.scatter(*dataSet.T)
lenth = dataSet.shape[0]
if rank == 0:
rank = dataSet.shape[1]+1
dataSet = np.matrix(dataSet)
covMat = dataSet.T*dataSet/(lenth-1)
eigenVals, eigenVec = np.linalg.eigh(covMat)
pick_id = eigenVals.argsort()[::-1][:rank] #从小到大排序,返回数组序号,然后倒着取,取前r个
eigenVec_picked = eigenVec[:,pick_id]#取出排序后的特征向量
#print(eigenVec_picked)
#print(eigenVals, eigenVec)
Y= dataSet*eigenVec_picked; #相当于求了个新坐标系下的数据分布

return Y, eigenVec_picked, means

datas = dataLoader('testSet.txt')
Y,P,means = pca(datas,1)
plt.scatter(*datas.T) #原数据
plt.scatter(*( Y*P.T+np.tile(means,(len(Y),1)) ).T,color='r')#降维以后的数据变换到原来的坐标下...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: