天天看點

主成分分析原理及Python實作

主成分分析(Principal Components Analysis, PCA)是一種常用的資料分析手段,是圖像處理過程中常用到的降維方法。對于一組不同次元之間可能存線上性相關關系的資料,PCA能夠把這組資料通過正交變換變成各個次元之間線性無關的資料,通過剔除方差小的那些次元上的資料,達到資料降維的目的。

PCA從原始變量出發,通過旋轉變化(即原始變量的線性組合)建構出一組新的,互不相關的新變量,這些變量盡可能多的解釋原始資料之間的差異性(即資料内在的結構),他們就成為原始資料的主成分。由于這些變量不相關,是以他們無重疊的各自解釋一部分差異性。依照每個變量解釋時差異性大小排序,他們成為第一主成分,第二主成分,以此類推。

PCA的思想是将n維特征映射到k維上(k<n),這k維特征稱為主元(主成分),是舊特征的線性組合,這些線性組合最大化樣本方差,盡量使用新的k個特征互不相關。這k維是全新的正交特征,是重新構造出來的k維特征,而不是簡單地從n維特征中取出其餘n-k維特征。

下面說一下PCA降維的算法步驟。

設有m條n維資料:

1) 将原始資料按列組成n行m列矩陣X

2)将X的每一行(代表一個屬性字段)進行零均值化(去平均值),即減去這一行的均值

3)求出協方差矩陣

4)求出協方差矩陣的特征值及對應的特征向量

5)将特征向量按對應特征值大小從上到下按行排列成矩陣,取前k行組成矩陣P(保留最大的k各特征向量)

6)Y=PX 即為降維到K維後的資料

PCA算法的主要優點:

1)僅僅需要以方差衡量資訊量,不受資料集以外的因素影響

2)各主成分之間正交,可消除原始資料成分間的互相影響的因素

3)計算方法簡單,主要運算是特征值分解,易于實作

  PCA算法的主要缺點:

1)主成分各個特征次元的含義具有一定的模糊性,不如原始樣本特征的解釋性強

2)方差小的非主成分也可能含有對樣本差異的重要資訊,因降維丢棄可能對後續資料處理有影響

利用Python實作主成分降維代碼:

from numpy import *
 
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 mat(datArr)
 
def pca(dataMat, topNfeat=999999):
    meanVals = mean(dataMat, axis=0)
    DataAdjust = dataMat - meanVals           #減去平均值
    covMat = cov(DataAdjust, rowvar=0)
    eigVals,eigVects = linalg.eig(mat(covMat)) #計算特征值和特征向量
    #print eigVals
    eigValInd = argsort(eigVals)
    eigValInd = eigValInd[:-(topNfeat+1):-1]   #保留最大的前K個特征值
    redEigVects = eigVects[:,eigValInd]        #對應的特征向量
    lowDDataMat = DataAdjust * redEigVects     #将資料轉換到低維新空間
    reconMat = (lowDDataMat * redEigVects.T) + meanVals   #重構資料,用于調試
    return lowDDataMat, reconMat
           
import matplotlib
import matplotlib.pyplot as plt
 
dataMat = loadDataSet('testSet.txt')
lowDMat, reconMat = pca(dataMat,1)
print "shape(lowDMat): ",shape(lowDMat)
 
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()
           
主成分分析原理及Python實作

詳細完整代碼及資料集下載下傳:

點選我檢視源碼

參考:

https://www.cnblogs.com/wj-1314/p/8032780.html

相關文獻:http://www.cs.otago.ac.nz/cosc453/student_tutorials/principal_components.pdf