1. 程式人生 > >機器學習-python編寫主成分分析(PCA)資料降維

機器學習-python編寫主成分分析(PCA)資料降維

程式碼及資料集下載:PCA
在機器學習之前通常需要對資料進行降維處理,有以下原因:

  • 使得資料集更易使用
  • 降低很多演算法的計算開銷
  • 去除噪聲
  • 使得結果易懂

這裡講的降維方法為主成分分析法(PCA),將資料從原來的座標系轉換到新的座標系,新的座標系的選擇是由資料本身決定的。第一個座標軸選擇的是原始資料中方差最大的方向,第二個新最標軸的選擇和第一個座標軸正交且具有最大方差的方向。該過程一直重複,重複次數為想要保留原始資料特徵的數目。我們會發現,大部分方差都包含在最前面的幾個新的座標軸中,因此我們忽略餘下的方差小的最標軸。方差越大代表該特徵包含的資訊越多,代表資料的差異。PCA中假設資料是不相關的。

PCA的原理及流程如下:
- 假設變換後的座標系為W={w1,w2,..,wd},為一組標準正交基。
- m個數據集為X={x1,x2,...,xm}
- 對m個數據的每個特徵進行中心化,使得ixi=0
- 資料的協方差矩陣為ixixTi。協方差矩陣數學知識可以看關於協方差矩陣在機器學習中的理解
- 選取方差最大方向等價於選取協方差矩陣最大的特徵值及其特徵向量。取協方差矩陣前d個最大的特徵值及其對應的特徵向量。
- 將特徵向量排序後組成W矩陣。投影后的樣本為WTxi

降維後的維數d選取方法:
1. 由使用者事先指定d
2. 通過在d值不同的低維空間中對k近鄰分類器(或其他開銷較小的學習器)進行交叉驗證來選取較好的d

值。
3. 從重構的角度設定一個重構閾值,例如t=95%,然後選取使下式成立的最小的d值。d為原資料維數。

i=1dλii=1dλit

虛擬碼:

輸入:樣本集X={x1,x2,...,xm};低維空間維度d
輸出:投影矩陣W={w1,w2,..,wd}
過程:
1.對樣本進行中心化
2.計算協方差矩陣XXT
3.對協方差矩陣進行特徵值分解XXT
4.取最大的d個特徵值及其對應的特徵向量組成W={w1,w2,..,wd}
python程式碼為

import numpy as np
import matplotlib.pyplot as
plt def loadData(filename,delim = '\t'): with open(filename) as fr: stringArr = [line.strip().split(delim) for line in fr.readlines()] dataArr = [list(map(float,line)) for line in stringArr] return np.mat(dataArr) def pca(dataSet,topNfeat = 99999999): dataMean = np.mean(dataSet,axis = 0) meanRemoved = dataSet - dataMean covMat = np.cov(meanRemoved,rowvar=0) eigVals,eigVec = np.linalg.eig(np.mat(covMat)) eigValInd = np.argsort(eigVals) eigValInd = eigValInd[:-(topNfeat+1):-1] redEigVects = eigVec[:,eigValInd] lowDDataMat = meanRemoved * np.mat(redEigVects) reconMat = lowDDataMat * redEigVects.T + dataMean return lowDDataMat,reconMat data = loadData('testSet.txt') lowdata,recondta = pca(data,1) fig = plt.figure(0) ax = fig.add_subplot(111) ax.scatter(data[:,0],data[:,1],s=90,marker='^',c='r') ax.scatter(recondta[:,0],recondta[:,1],s=30,marker='o',c='b') plt.show()