【发布时间】:2014-06-14 23:11:24
【问题描述】:
我正在尝试使用 LIBSVM 实现 one vs rest 多类分类。
这个链接很有用http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/ovr_multiclass/ 但我在函数 'ovrpredict()' 中遇到错误。
功能如下:
function [pred, ac, decv] = ovrpredict(y, x, model)
labelSet = model.labelSet;
labelSetSize = length(labelSet);
models = model.models;
decv= zeros(size(y, 1), labelSetSize);
for i=1:labelSetSize
[l,a,d] = svmpredict(double(y == labelSet(i)), x, models{i});
decv(:, i) = d * (2 * models{i}.Label(1) - 1); % ERROR IN THIS LINE
end
[tmp,pred] = max(decv, [], 2);
pred = labelSet(pred);
ac = sum(y==pred) / size(x, 1);
我得到的错误信息是Reference to non-existent field 'Label'。
任何建议都会很有帮助。
编辑 1
用于调用函数的代码:\
[trainY trainX]=libsvmread('libfacecombine.train');
[testY testX]=libsvmread('libfacetest.train');
model=ovrtrain(trainY,trainX,'-c 8 -g 4');
[~,accuracy,~]=ovrpredict(testY,testX,model);
训练和测试数据即“libfacecombine.train”和“libfacetest.train”是从.csv文件中获取的:
f1=createdabase(f); % where createdatabase is a function to read various images from a folder and arrange into 1D array
[sig1 mn1]=pcam(f1); % where pcam is a function to find 'pca'(sig1) and 'mean'(mn1) of the data
%labelling is done this way:
%Positive class
label=[];
for i=1:length(sig1)
for j=1:1
label(i,j)=+1;
end
end
csvwrite('face1.csv',[label sig1]);
%Negative class
label1=[];
for i=1:length(sig2) % sig2 obtained in same way as sig1
for j=1:1
label1(i,j)=-1;
end
end
csvwrite('face2.csv',[label sig2]);
使用“附加”模式将这两个文件合并并转换为 .train 文件。 测试数据也是如此。
编辑 2
我有 5 节课。并且标记为: 第 1 类:+1 包含来自 Face 1 的 4 张图像的特征,-1 包含来自非 Face 1 的 4 张图像(人脸 2、3、4 和 5)的特征。 2类:+2包含来自Face 2的4张图像的特征,-2包含来自非Face 2(面1、3、4和5)的4张图像的特征...... 5类:+5包含来自Face 2的4张图像的特征面 5 和 -5 包含来自非面 5(面 1、2、3 和 4)的 4 张图像的特征。所有这些特征连同标签都按上述顺序写入 .csv 文件,然后转换为 .train 格式。因此我获得了训练文件。
对于测试图像,我拍摄一张人脸 1 的图像并给出其真实标签,即 +1 并写入 .csv 文件,然后转换为 .train。因此我获得了测试文件。当我运行程序时,我会得到如下结果:
Accuracy=92%(12/13)classification;
Accuracy=61%(8/13)classification;
Accuracy=100%(13/13)classification;
Accuracy=100%(13/13)classification;
Accuracy=100%(13/13)classification;
Accuracy=100%(13/13)classification;
当我只有 5 个类时,为什么我会获得 6 个准确度值?
【问题讨论】:
-
你能确认你得到的错误信息是
Undefined variable Label吗?当您不小心引用了一个不存在的变量时,这不是您会得到的确切文本,这让我认为您可能记错了错误。此外,我不确定您如何从该行中获取该错误。也许是Reference to non-existent field 'Label'? -
@Amro:我的数据集是人脸图像。我在做人脸识别。我已经看过你以前的答案,但都使用了fisheriris,而且我标记数据的方式与这个数据集不同。我将返回调用函数的代码。
-
@SamRoberts:是的,错误消息是“引用不存在的字段‘标签’”。对不起,我记错了。我该如何克服它?
-
@Sid:我不明白,根据您上面的代码,您有两个类(正面和负面实例)。那么,当您只有二元分类时,为什么需要执行 one-vs-rest 呢?此外,您仍然没有提供有关数据的足够信息:您有多少特征?类标签的类型是什么?你如何从 CSV 文件到 libsvm 稀疏表示?如果可能,您应该发布一小部分数据样本和可重现的示例代码..
标签: matlab classification libsvm