KNN / SVM 手寫數字識別-PCA降維
阿新 • • 發佈:2018-12-29
一.問題分析
採用機器學習演算法對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
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.
---再回首,再更新----