PCA降維 python實現
阿新 • • 發佈:2019-01-23
主成分分析,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')#降維以後的資料變換到原來的座標下...