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。
我想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。