Matlab實現手寫數字識別(PCA+KNN)
阿新 • • 發佈:2019-01-31
</pre><pre name="code" class="plain">clear; addpath('../data/'); % images_train = loadMNISTImages('train-images-idx3-ubyte')'; images_train_label=loadMNISTLabels('train-labels-idx1-ubyte'); % save('../data/images_train_label.mat','images_train_label'); % images_test=loadMNISTImages('t10k-images-idx3-ubyte')'; images_test_label=loadMNISTLabels('t10k-labels-idx1-ubyte'); % [pc,score,latent,tsquare] = princomp(images_train); % p_d_ratio=cumsum(latent)./sum(latent); % p_mean=mean(images_train); % p_d=87; % 90% % train_pca=score(:,1:p_d); % save('../data/train_pca.mat','train_pca'); load('../data/train_pca.mat'); % for i=1:10000 % test_pca(i,:)=(images_test(i,:)-p_mean)*pc(:,1:p_d); % end % save('../data/test_pca.mat','test_pca'); load('../data/test_pca.mat'); mdl = ClassificationKNN.fit(train_pca,images_train_label,'NumNeighbors',1); predict_label_knn=predict(mdl, test_pca); accuracy_knn=length(find(predict_label_knn == images_test_label))/length(images_test_label)*100; </span>
PCA介紹很詳細的資料:
PCA 降維演算法詳解 以及程式碼示例 - New begin, new life - 部落格頻道 - CSDN.NET http://blog.csdn.net/watkinsong/article/details/38536463
Matlab PCA的函式:[COEFF,SCORE,latent,tsquare] = princomp(X)
COEFF為輸入X在原空間到主成份空間的變換過程,SCORE為X在主成份空間的表示,latent為每個X協方差矩陣特徵值所佔的比重,ts不瞭解。
前P個latent值超過90%即可選取前面的特徵代替整體,達到降維。
此函式中X為N*K矩陣,N個數據,K個特徵,有SCORE=(X-mean(X))*COEFF。
值得注意的時在測試資料降維時,要先減去訓練資料的均值。
在計算自相關矩陣時訓練資料進行歸一化,本次的樣本資料之前均已歸一化。
這次只用到了分類,不需要重構,重構還需要用到K-L變換等知識。
K-NN非常適合這個分類器,原理也很簡單,準確率97%。
另外我將之前LBP+SVM的過程用PCA代替LBP,發現準確率由68%上升到87%,果然之前想的沒錯,特徵提取很關鍵。