機器學習-python編寫主成分分析(PCA)資料降維
程式碼及資料集下載:PCA
在機器學習之前通常需要對資料進行降維處理,有以下原因:
- 使得資料集更易使用
- 降低很多演算法的計算開銷
- 去除噪聲
- 使得結果易懂
這裡講的降維方法為主成分分析法(PCA),將資料從原來的座標系轉換到新的座標系,新的座標系的選擇是由資料本身決定的。第一個座標軸選擇的是原始資料中方差最大的方向,第二個新最標軸的選擇和第一個座標軸正交且具有最大方差的方向。該過程一直重複,重複次數為想要保留原始資料特徵的數目。我們會發現,大部分方差都包含在最前面的幾個新的座標軸中,因此我們忽略餘下的方差小的最標軸。方差越大代表該特徵包含的資訊越多,代表資料的差異。PCA中假設資料是不相關的。
PCA的原理及流程如下:
- 假設變換後的座標系為
- m個數據集為
- 對m個數據的每個特徵進行中心化,使得
- 資料的協方差矩陣為
- 選取方差最大方向等價於選取協方差矩陣最大的特徵值及其特徵向量。取協方差矩陣前
- 將特徵向量排序後組成
降維後的維數
1. 由使用者事先指定
2. 通過在
3. 從重構的角度設定一個重構閾值,例如
虛擬碼:
輸入:樣本集
輸出:投影矩陣
過程:
1.對樣本進行中心化
2.計算協方差矩陣
3.對協方差矩陣進行特徵值分解
4.取最大的
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()