libsvm matlab 中的 2 个错误 "Model does not support probabiliy estimates and Subscripted assignment dimension mismatch"

2 errors in libsvm matlab "Model does not support probabiliy estimates and Subscripted assignment dimension mismatch"

我想class使用库 LIBSVM 和策略 'one against all' 确定 5 个测试图像的列表,以获得每个 class 的概率。使用的代码如下:

load('D:\xapp.mat');
load('D:\xtest.mat');
load('D:\yapp.mat');%% matrix contains true class of images yapp=[641;645;1001;1010;1100]
load('D:\ytest.mat');%% matrix contains unlabeled class of test set  ytest=[1;2;3;4;5]
numLabels=max(yapp);
numTest=size(ytest,1);
%# train one-against-all models
model = cell(numLabels,1);
for k=1:numLabels
   model{k} = svmtrain(double(yapp==k),xapp, ['-c 1000 -g 10 -b 1 ']);
end
%# get probability estimates of test instances using each model
prob = zeros(numTest,numLabels);
for k=1:numLabels
   [~,~,p] = svmpredict(double(ytest==k), xtest, model{k}, '-b 1');
   prob(:,k) = p(:,model{k}.Label==1);    %# probability of class==k
end
%# predict the class with the highest probability
[~,pred] = max(prob,[],2);
acc = sum(pred == ytest) ./ numel(ytest)    %# accuracy

我得到这个错误:

Model does not support probabiliy estimates
Subscripted assignment dimension mismatch.
Error in comp (line 98)
prob(:,k) = p(:,model{k}.Label==1); %# probability of class==k

请帮我解决这个错误,在此先感谢

您尝试做的是使用评估 SVM 分类器性能的代码片段,而您的目标是正确估计测试集的标签。

我假设您的五个标签是 [641;645;1001;1010;1100](如 yapp)。您要做的第一件事是删除 ytest,因为您不知道测试集的任何标签。用一些虚拟值填充 ytest 毫无意义:SVM 将 return 我们的预测标签。

第一个错误,正如评论中已经指出的那样,在

numLabels=max(yapp);

您必须将 max() 更改为 length() 才能收集 类 的数量。

训练阶段基本正确
鉴于 k 从 1 到 5 而 yapp 具有上述范围,您应该考虑将 double(yapp==k) 更改为 double(yapp==yapp(k)):以这种方式我们将 k 标记为正- yapp 中的第一个值。鉴于 k 从 1 变为 5,那么 yapp(k) 将从 641 变为 1100。

现在是预测阶段。
svmpredict() 的第一个输入应该是测试标签,但现在我们不知道它们,所以我们可以用零向量填充它(测试集中的模式数与零数一样多)。这是因为如果测试标签已知,svmpredict() 也会自动 returns 准确度,但事实并非如此。因此,您必须将第二个 for 循环更改为

for k=1:numLabels
   [~,~,p] = svmpredict(zeros(size(xtest,1),1), xtest, model{k}, '-b 1');
   prob(:,k) = p(:,model{k}.Label==1);    %# probability of class==k
end

最后用

预测标签
[~,pred] = max(prob,[],2);

pred 包含预测标签。

注1:然而,在这种方法中,你不能测量精度and/or其他参数,因为我们所说的测试集实际上不是测试集。测试集是一个标记集,我们假装不知道它的标签,以便让 SVM 预测它们,然后将预测的标签与实际标签相匹配,以衡量其准确性。

注释 2:由于第二个 for 循环,pred 中的预测标签很可能具有 1 到 5 范围内的值。但是,由于您的标签具有不同的值,因此您可以映射回考虑到 1 是 641,2 是 645,3 是 1001,4 是 1010,5 是 1100。