1. 程式人生 > >Matlab實現手寫數字識別(PCA+KNN)

Matlab實現手寫數字識別(PCA+KNN)

</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%,果然之前想的沒錯,特徵提取很關鍵。