1. 程式人生 > >KNN / SVM 手寫數字識別-PCA降維

KNN / SVM 手寫數字識別-PCA降維

一.問題分析

採用機器學習演算法對usps和mnist兩個資料集完成手寫數字識別任務。

1.1.資料集介紹

  • MNIST 

MNIST 資料集來自美國國家標準與技術研究所, National Institute of Standards and Technology (NIST)。訓練集 (training set) 由來自 250 個不同人手寫的數字構成, 其中 50% 是高中學生, 50% 來自人口普查局 (the Census Bureau) 的工作人員,測試集(test set) 也是同樣比例的手寫數字資料。訓練資料集共包含 60,000 個樣本。

  • USPS
美國郵政服務USPS手寫數字識別庫,庫中均為16*16畫素的灰度影象的值,灰度值已經被歸一化。訓練資料集共包含 4649 個樣本。整個訓練集是一個(4649, 256)維的矩陣。以資料集中前10條資料為例,把資料處理為圖片輸出,

PCA降維

降維技術使得資料集變得更容易使用,並且它們往往能夠去除資料中的噪聲,使得其他機器學習任務更加精確。降維往往作為預處理步驟,在資料應用到其他演算法之前清洗資料。其中PCA(主成分分析)應用最廣泛。PCA(主成分分析)可以從資料中識別主要特徵,它是通過沿著資料最大方差旋轉座標軸來實現的。

主要步驟(保留前N個主成分):

a)  去除平均值

b)  計算協方差矩陣

c)  計算協方差矩陣的特徵值和特徵向量

d)  將特徵值從大到小排序

e)  保留最上面的N個特徵向量

f)  將資料轉換到上述的N個特徵向量構建的新空間中

程式碼:

def pca(self, dataMat, K=9999999):   # dataMat是原始資料,一個矩陣,K是要降到的維數  
      meanVals = mean(dataMat, axis=0)      # 第一步:求均值  
      meanRemoved = dataMat - meanVals      # 減去對應的均值  
      covMat = cov(meanRemoved, rowvar=0)   # 第二步,求特徵協方差矩陣  
      eigVals, eigVects = linalg.eig(mat(covMat))   # 第三步,求特徵值和特徵向量  
      eigValInd = argsort(eigVals)     # 第四步,將特徵值按照從小到大的順序排序  
      eigValInd = eigValInd[: -(K+1): -1]        # 選擇其中最大的K個  
      redEigVects = eigVects[:, eigValInd]       # 然後將其對應的k個特徵向量分別作為列向量組成特徵向量矩陣.  
      lowDDataMat = meanRemoved * redEigVects    # 第五步,將樣本點投影到選取的特徵向量上,得到降維後的資料  
      reconMat = (lowDDataMat * redEigVects.T) + meanVals   # 還原資料  
      contribution = self.calc_single_contribute(eigVals, eigValInd)   # 計算單維貢獻度,總貢獻度為其和  
      return lowDDataMat, reconMat,contribution 

lowDDataMat 為降維後的資料。reconMat 為(還原後的)原始資料。

REFERENCE

1, 《機器學習實戰》Peter Harrington 著.2017.8.

---再回首,再更新----