我想使用庫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