Mnist数据集模式识别准确性

时间:2016-10-06 06:43:34

标签: matlab machine-learning classification pattern-recognition mnist

我是matlab的新手,这是我的第一个项目。 Mnist在0到9之间有60000张图片用于训练,1000张图片用于测试。我做的是尝试通过使用mean.then为所有这10个类(0到9)制作一个模式用于识别我使用欧几里德距离。这很简单,但准确度非常低。 我不知道我的问题在哪里才能给我这个百分比的准确性。准确度:1.73%

这是我的代码 为我们所有的班级找到10个模式:

root = 'F:\matlab\ex1\exercise-EquivaliencOfL2DistanceAndDotProduct\dataset';

fn = strcat (root, '\MnistTrainX.mat');
load (fn);

fn = strcat (root, '\MnistTrainY.mat');
load (fn);

weights = zeros (10, 784);
b = zeros (10, 1);

im=reshape(MnistTrainX(5,:),[28 ,28]);
imshow(im,[]);
imshow(im',[]);

for c=1 : 10
    idx=find(MnistTrainY == c-1);
   weights (c,:)=mean( MnistTrainX(idx,:));
end

trainAccuray = ComputeInnerProductAccuracy(weights,b, MnistTrainX,MnistTrainY);
display(trainAccuray);

fn = strcat (root, '\MnistTestX.mat');
load (fn);

fn = strcat (root, '\MnistTestY.mat');
load (fn);


testAccuray  = ComputeInnerProductAccuracy(weights, b, MnistTestX, MnistTestY);
display(testAccuray);

这是准确性函数

function [acc]=ComputeInnerProductAccuracy(weights, b, X, Y)

n = size(X, 1);
minmat = zeros (60000, 2);
endmat = zeros (60000, 10);
m = size(X);
a=0;
for i=1 : n
    for j=1 : 10
        endmat(i,j)=sum((X(i,:)-(weights(j,:))).^2,2);
    end

    [minmat(i,1) ,minmat(i,2)]= min(endmat(i,:));
    if minmat(i,2)== Y(i)
        a=a+1;
    end

end
acc=(a*100)/60000;
end

1 个答案:

答案 0 :(得分:2)

你的代码大多是正确的,尽管效率很低。我不会花时间提高效率,因为有许多领域需要解决。相反,我会专注于错误。代码有两个问题。首先是当你发现哪个数字的距离最短时:

[minmat(i,1) ,minmat(i,2)]= min(endmat(i,:));

请注意,min的第二个输出会生成最小值从索引1 开始的位置。 Y中的类值应该包含0到9,但是在您的情况下,min的输出索引是1到10.输出最小索引和相应的类值彼此相差1,其中这可能是你准确性差的原因。

因此,在检查最小标签是否确实是基本事实之前,您必须从minmat(i, 2)中减去1 ...或者您只需在检查时将{1}添加1 {/ 1}} p>

Y(i)

第二件事是不正确的是“内部产品”功能(实际上你正在计算欧几里德距离......但是让我们把它放在一边这个答案)假设你的测试集总是有60000个输入没有这么多的输入。这样可以很好地处理您的训练数据,但会报告测试数据的准确性不正确。确保将函数中的所有60000实例更改为[minmat(i,1) ,minmat(i,2)]= min(endmat(i,:)); if minmat(i,2)== Y(i)+1 % Change a=a+1; end 。您已在代码中创建的此变量确定了有多少输入。