我想使用库LIBSVM对策略'one against all'对5个测试图像进行分类,以便获得每个策略的概率类。所使用的代码波纹管:libsvm matlab中的2个错误“模型不支持概率估计和下标分配维度不匹配”
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
我得到这个错误:
型号不支持probabiliy估计
下标的转让尺寸不匹配。
错误排版(线98)
概率(:,K)= P(:,模型{K} .Label == 1);班%#概率==ķ
请帮我提前解决这个错误,并感谢
我估计错误在行numLabels = MAX(YAPP);'。在这一行中,你基本上说有1100个标签,而这是不正确的,因为你有5个标签。如果'yapp = [641; 645; 1001; 1010; 1100]',那么类的数量是'length(yapp)',而不是'max(yapp)'。 – Alessiox
感谢您的回复,澄清:xapp代表训练集,xtest包含测试集。我知道proplem来自这行numLabels = max(yapp);但是当我用长度替换max(yapp)时,我得到相同的错误。感谢您的任何建议 – aya
你还应该注意'double(yapp == k)'这一行。使用'k'从1到'numLabels'和'yapp',它的范围是[[641; 645; 1001; 1010; 1100]],这个相等性将永远不会被验证。我不认为这会消除这个错误,但是你会得到所有类的全零标签,并且这永远不会导致正确的结果。 – Alessiox