【发布时间】:2017-02-14 19:11:11
【问题描述】:
我对 matlab 完全陌生,这是我的第一个项目。 Mnist 有 60000 张介于 0 和 9 之间的图片用于训练,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、2 等),它们看起来都非常不同。找到所有这些数字的平均值并不能很好地表示每个数字在实践中的样子。顺便说一句,您的代码没有计算内积。它正在计算欧几里得距离。
-
@rayryeng 是的,你完全正确,我知道,但这是我们的练习,我们的老师通过这种方式获得了 82% 的准确率。我认为这种低准确度可能来自我的功能。
-
ِِ亲爱的@rayryeng 提醒我请你帮我解决另一个问题?
-
当然。我能提供什么帮助?
-
@rayryeng 谢谢你重播我。我在 30 分钟前解决了它:D,我不认为我可以自己让它工作,但它工作得很好,虽然 8 小时后,我使用 kmean 来提高我的准确性。我希望这个提及不会打扰您。
标签: matlab machine-learning classification pattern-recognition mnist