为什么准确度为0%? MATLAB LIBSVM

时间:2014-01-31 07:08:21

标签: matlab machine-learning libsvm pca

我使用以下方法提取 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的结果写在CSV文件中,标签分别为+1和-1。 然后我使用LIBSVM来获得真实标签时的准确度,它返回0%,当我试图预测标签时它是-1而不是+1。

准确度为0%?

基本上我的模型没有正确训练,我没有看到错误。

任何建议都将不胜感激。

5 个答案:

答案 0 :(得分:1)

使用Eigenfaces作为训练集,用1或-1组成label向量(如果Eigenfaces的第i列引用1,则{{1}中的第i个元素是1,否则为-1)。并在label函数中使用Eigenfaceslabel

答案 1 :(得分:1)

@ lennon310:

for i=1:length(Eigenfaces)                   
    temp=Eigenfaces'*A(:,i);
    proj_imgs=[proj_imgs temp];
end

答案 2 :(得分:1)

@ lennon310:

   diff=double(inputimg)-mn;   %mn is the mean of training data

   testfeaturevector=Eigenfaces'*diff;

答案 3 :(得分:0)

坦率地说,你的代码很乱。

一个值得怀疑的部分:

data = reshape(data, M*N,1);

这不会使data成为只有1列的矩阵吗?这没有意义。

eigenfaces上查看本教程。其中有代码和示例向您展示如何操作。有关详细信息,请参阅相关网页here。 可以找到Matlab / Octave代码here

答案 4 :(得分:0)

@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;