03.04 機器學習—主成分分析(PCA)實戰演練

本文主要講機器學習中的一種數據處理方法,主成分分析(Principal components analysis)

機器學習—主成分分析(PCA)實戰演練

記2018年的烏蘭布統之遊

(翻看相冊配圖發現2018年拍的這張張片好美,可以做壁紙了呢!)

算法簡介:

主成分分析是數據挖掘中常用的一種降維算法,最早是Pearson在1901年提出,隨著發展到後來Hotelling在1933年正式提出的一種多變量的統計方法。

其主要用途在於“降維”,即通過分析取主成分表現出的最大的個別差異,在機器學習中用來削減迴歸分析和聚類分析中變量的數目,類似於因子分析。降維就是把具有相關性的變量數目減少,用較少的變量來取代原先變量。

機器學習—主成分分析(PCA)實戰演練

本文主要實現基於Python的PCA代碼實現方法和流程,採用的數據集為Github上的原始數據。代碼全文均有各個步驟的註釋說明,特別適合於剛入機器學習的同學練習。

PCA實現主要步驟:

(1)調試數據集下載:

鏈接:https://github.com/zhangqingfeng0105/MachineLearn/blob/master/PCA_data_set/pca_data_set1.txt

https://github.com/zhangqingfeng0105/MachineLearn/blob/master/PCA_data_set/pca_data_set2.txt

(2)算法流程

① 對原數據集零均值化。代碼:

<code>meanRemoved = dataMat - mean(dataMat,axis=0)/<code>

② 求出均值化X的協方差矩陣:公式是:

<code>Cov(X)=\\frac{1}{m-1}X^{T}X,代碼:covMat = cov(meanRemoved,rowvar=0)/<code>

③ 求這個協方差矩陣的特徵值,特徵向量,代碼:

<code> eigVals, eigVects = linalg.eig(mat(covMat))/<code>

④ 把這些特徵值按從大到小排列,返回特徵值的下標,代碼:

<code>eigValInd = argsort(-eigVals) /<code>

⑤ 選出前topNfeat個特徵值,返回這些選中的特徵值的下標,並根據下標從特徵向量矩陣eigVects中取出這些選中的特徵向量組成矩陣P,這就是我們要找的變換矩陣P,代碼:

<code>redEigVects = eigVects[:,eigValInd[:topNfeat] ]/<code>

⑥ 返回降維後的數據,公式是:Y=X•P,代碼:

<code>lowDDataMat = meanRemoved * redEigVects/<code>

⑦ 原數據映射到新的空間中。公式及代碼:

<code>X^{'}=Y\\cdot P^{T}+mean/<code>
<code>reconMat = (lowDDataMat * redEigVects.T) + meanValues/<code>

代碼樣例:

<code># @Author : quan
# @Software : PyCharm
from numpy import *
import matplotlib.pyplot as plt
def loadDataSet(filename):
dataSetList = []
fr = open(filename)
for row in fr.readlines():
cur_line = row.strip().split("\\t") #去掉數據中的空格
# print(cur_line)
proce_line = list(map(float,cur_line)) #格式化
dataSetList.append(proce_line) #創建數據集
dataSetList = array(dataSetList) #數據集轉換為數組
return dataSetList
def Pca(dataMat,topNfeat = 999999):
meanValues = mean(dataMat,axis=0) #豎著求平均值,數據格式為mxn
meanRemoved = dataMat - meanValues #0均值化
covMat = cov(meanRemoved,rowvar=0) #每一列作為一個獨立變量求協方差
eigVals,eigVects = linalg.eig(mat(covMat)) #求特徵值和特徵向量
eigValInd = argsort(-eigVals) #特徵值由大到小排列,eigvalidInd數組
eigValInd = eigValInd[:topNfeat] #選取前topfeat個特徵值的序號,取第一列的序號

redEigVects = eigVects[:,eigValInd] #把符合條件的幾列特徵篩選出來組成p
lowDDataMat = meanRemoved * redEigVects #矩陣點乘篩選的特徵向量矩陣 m×r維 公式Y=X*P
reconMat = (lowDDataMat * redEigVects.T) + meanValues # 轉換新空間的數據 m×n維
reconMat = array(reconMat)
return lowDDataMat,reconMat
def DrawPoints(dataset1,dataset2):
fig = plt.figure() #添加圖布
ax1 = fig.add_subplot(211) #添加子圖
ax2 = fig.add_subplot(212) #添加子圖
ax1.scatter(dataset1[:,0],dataset1[:,1],marker="s",s=10,color="red")
ax2.scatter(dataset2[:,0],dataset2[:,1],s=10,color="blue")
plt.show()
if __name__ == "__main__":
data = loadDataSet("/home/quan/PycharmProjects/untitled3/PCAtest/pca_data_set2.txt")
process_data,reconMat = Pca(data,1)
DrawPoints(data,reconMat)/<code>

以下是針對兩個數據集的測試效果:

機器學習—主成分分析(PCA)實戰演練

Test_date_1

機器學習—主成分分析(PCA)實戰演練

Test_data_2


分享到:


相關文章: