主成分分析(PCA,Principal Component Analysis)
阿新 • • 發佈:2018-12-08
主成分分析(PCA,Principal Component Analysis)
1、理論
1)概要
PCA(主成分分析)是機器學習中一種資料降維演算法,具體地為一個樣本的特徵通常用一個n維向量表示,PCA通過對資料進行正交線性變換將其對映到一個新的空間中且維度不變,經過變換後任意兩個維度線性無關,且在第一維方差最大,第二維次之,以此類推最後一維方差最小。最後根據一定的標準取前面k維達到降維的目的。
PCA演算法最後的目標是對高維資料進行降維,但是在前面的正交線性變換則實現了對資料的去噪,使得資料中隱含的模式更加清晰的凸顯出來,便於後續基於特徵的機器學習演算法的學習收斂。
2)推導
詳細的理論推導可以參見知乎:https://zhuanlan.zhihu.com/p/21580949,循序漸進寫的非常仔細
2、演算法
假設樣本集中,有m個樣本,每個樣本特徵維數為n。
1)將所有樣本的特徵列向量組合起來構成一個n行m列的樣本集特徵矩陣X。
2)將X的每一行進行零均值化,即減去這一行的均值,具體地為求所有樣本在這一維的特徵的平均值,然後這一行所有值減去該均值。
3)求X的協方差矩陣
4)求出協方差矩陣的特徵值及對應的特徵向量
5) 將特徵值按降序排序,同時特徵向量對應的特徵向量也對應排列,然後取取前k行組成矩陣P(注意這裡的特徵向量經過轉置再排列)
6)Y=PX即為降維到k維後的資料
3、python實現
#-*- coding:utf-8-*- from numpy import * import numpy as np import os import matplotlib.pyplot as plt #機器學習實戰讀取資料 def loadDataSet(filename,delim = "\t"): fr = open(filename) stringArr = [line.strip().split(delim) for line in fr.readlines()] datArr = [map(float, line) for line in stringArr] return np.mat(datArr) #PCA實現函式 def PCA(dataMat,k): newData,meanVals=zeroMean(dataMat) covMat=np.cov(newData,rowvar=0) eigVals,eigVects=np.linalg.eig(np.mat(covMat)) eigValIndice=np.argsort(eigVals) n_eigValIndice=eigValIndice[-1:-(k+1):-1] n_eigVect=eigVects[:,n_eigValIndice] lowDataMat=newData*n_eigVect reconMat=(lowDataMat*n_eigVect.T)+meanVals return lowDataMat,reconMat data=loadDataSet("./testSet.txt") lowdataMat,reconMat=PCA(data,2) fig1 = plt.figure() fig2=plt.figure() ax = fig1.add_subplot(111) ay=fig2.add_subplot(111) ax.scatter(data[:,0].flatten().A[0], data[:,1].flatten().A[0], marker='^', s = 10 ) ay.scatter(lowdataMat[:,0].flatten().A[0], lowdataMat[:,1].flatten().A[0],marker='o', s = 20 , c ='red' ) plt.show()