为啥准确率是 0%? MATLAB LIBSVM
Posted
技术标签:
【中文标题】为啥准确率是 0%? MATLAB LIBSVM【英文标题】:Why is the accuracy coming as 0% ? MATLAB LIBSVM为什么准确率是 0%? MATLAB LIBSVM 【发布时间】:2014-02-23 19:24:56 【问题描述】:我使用以下方法提取了 PCA 特征:
function [mn,A1,A2,Eigenfaces] = pca(T,f1,nf1)
m=mean(T,2), %T is the whole training set
train=size(T,2);
A=[];
for i=1:train
temp=double(T(:,i))-m;
A=[A temp];
end
train=size(f1,2); %f1 - Face 1 images from training set 'T'
A=[];
for i=1:train
temp=double(f1(:,i))-m;
A1=[A1 temp];
end
train=size(nf1,2); %nf1 - Images other than face 1 from training set 'T'
A=[];
for i=1:train
temp=double(nf1(:,i))-m;
A2=[A2 temp];
end
L=A'*A;
[V D]=eig(L);
for i=1:size(V,2)
if(D(i,i)>1)
L_eig=[L_eig V(:,1)];
end
end
Eigenfaces=A*L_eig;
end
然后我只从训练数据中投影出人脸 1(+1 类):
功能 1
for i=1:15 %number of images of face 1 in training set
temp=Eigenfaces'*A1(:,i);
proj_img1=[proj_img1 temp];
end
然后我从训练数据中预测其余的人脸(-1 类):
功能2
for i=1:221 %number of images of faces other than face 1 in training set
temp=Eigenfaces'*A2(:,i);
proj_img2=[proj_img2 temp];
end
功能 3 然后使用以下方法获得输入图像向量:
diff=double(inputimg)-mn; %mn is the mean of training data
testfeaturevector=Eigenfaces'*diff;
我将函数 1 和 2 的结果分别写在带有标签 +1 和 -1 的 CSV 文件中。 然后我使用 LIBSVM 在给出真实标签时获得准确度,它返回 0%,当我尝试预测标签时它是 -1 而不是 +1。
准确率是 0% 吗?
基本上我的模型没有正确训练,我没有看到错误。
任何建议将不胜感激。
【问题讨论】:
请注意:您没有使用 mn(沿第二维的平均值),然后继续减去沿第一维的平均值。不确定意图是什么...... @Falimond : 抱歉,函数 3 的平均值必须是“mn” 是 [f1 nf1] 组成你的 T(或 T 的某些列排列)? @lennon310: 是的 lennon,[f1 nf1] 组成 T 看起来您已经为此工作了一段时间,根据您在此处所说的内容,我不知道问题出在哪里。你的数据有多大?如果您可以将所有东西上传到某个地方(包括对它们的清晰描述),我想尝试一下 libsvm。谢谢 【参考方案1】:以Eigenfaces
为训练集,用1或-1组成一个label
向量(如果Eigenfaces
的第i列指1,则label
中的第i个元素为1,否则为-1) 。并在svmtrain
函数中使用Eigenfaces
和label
。
【讨论】:
谢谢你,我会试试这个。所以我不需要将“训练数据”投影到特征脸然后使用“proj_imgs”进行训练? "for i=1:length(A) temp=Eigenfaces'*A(:,i); proj_imgs=[proj_imgs temp]; end"【参考方案2】:@lennon310:
for i=1:length(Eigenfaces)
temp=Eigenfaces'*A(:,i);
proj_imgs=[proj_imgs temp];
end
【讨论】:
您无需再次投影。 Eigenfaces 已经是你的训练样本了。 @lennon310:好吧,列侬这就是我所困惑的。但是我投影测试图像的方式还可以吧? 没有。您在测试图像上再次执行 PCA,与在训练图像中所做的方式相同,只是您仍然使用来自训练图像的相同平均值。新生成的特征面将是您的 svmpredict 中的输入 列侬,下面的答案对吗?我减去了训练数据的平均值,然后投影到特征空间中【参考方案3】:@lennon310:
diff=double(inputimg)-mn; %mn is the mean of training data
testfeaturevector=Eigenfaces'*diff;
【讨论】:
这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post。 只需使用 testimg 生成一个新的 eigenfaces 数组。 @Charles:当我尝试在 cmets 部分编写代码 sn-p 时,它以单行形式出现,而不是代码,因此为方便起见,我将其写在答案部分,但我会以后要多加小心。 @lennon310:所以我发现测试图像的PCA如下?? @lennon310: temp=double(testimg)-m; %其中'm'是训练图像的平均值 L=temp'temp; [V D]=eig(L);对于 i=1:size(V,2) if(D(i,i)>1) L_eig=[L_eig V(:,1)]; end end Eigenfaces=tempL_eig;【参考方案4】:坦率地说,你的代码是一团糟。
一个有问题的部分:
data = reshape(data, M*N,1);
这不是让data
成为一个只有 1 列的矩阵吗?这没有意义。
在eigenfaces 上查看本教程。里面有代码和例子来告诉你该怎么做。详情请参阅相关网页here。 Matlab/Octave 代码可以在here找到。
【讨论】:
我改变了计算 PCA 的方式,请参阅有问题的编辑。请你现在看一下,告诉我哪里出错了。我会浏览你提到的链接,非常感谢。 我浏览了这个链接,它很有帮助,但它又不能解决我如何“标记投影”的问题?导致它使用最近邻进行分类,而不是 SVM。 看,如果你的原始向量有一个标签 k,那么它的投影版本只是有相同的标签。 然后我将 proj_img1 标记为标签 +1,因为这些是来自面 1 的投影,而 prog_img2 是标签 -1,因为这些是来自除面 1 之外的所有其他面的投影。 看,你可以在“多类”模式下训练 LIBSVM/LIBLINEAR,它会自动为 One-vs-all 或 one-vs-one 设置许多分类器,这意味着你不需要必须自己设置许多二进制 SVM。这可以由 LIBSVM/LIBLINEAR 自动处理。这是大多数 ML 包的标准行为。【参考方案5】:@lennon310:
temp=double(testimg)-m; %where 'm' is the mean of the training images
L=temp'*temp;
[V D]=eig(L);
for i=1:size(V,2)
if(D(i,i)>1)
L_eig=[L_eig V(:,1)];
end
end
Eigenfaces=temp*L_eig;
【讨论】:
Lennon 我试过这个,准确率是 0%。我不知道出了什么问题。 你的matlab中有princomp函数吗?也许您可以将其用于 pca 进行比较... @lennon310:我有 princomp ,我会尝试并回复你。我的特征空间的大小为 65536*10,其中 65536=256*256 是图像的大小,10=训练图像的数量。这意味着我的代码保留了所有值,而不仅仅是主要组件,对吗? 我不太明白保留所有值是什么意思。实际上,恢复的图像与原始图像大小相同(在您的情况下为 65536*10)。你可以看看这篇关于如何实现princomp的帖子:***.com/questions/21640801/…,并使你自己的代码与从princomp获得的结果一致。如果即使您使用 princomp 仍然存在问题,那可能是 libsvm 的问题。但目前只需确保 pca+eigenspace 部分都是正确的。谢谢 我不认为行会改变,你压缩你的数据是删除不相关的列,在你的情况下你只保留10列,但行号仍然是每个的大小图片 (256*256)以上是关于为啥准确率是 0%? MATLAB LIBSVM的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 matlab 中使用带有 libsvm 的预计算内核