Ich möchte eine Liste von 5 Testbildern mit der Bibliothek LIBSVM mit einer Strategie "Eins gegen Alle" klassifizieren, um Wahrscheinlichkeiten für jede zu erhalten Klasse. der verwendete Code ist unten:2 Fehler in libsvm matlab "Modell unterstützt keine Wahrscheinlichkeitsschätzungen und Subskriptionszuordnungsdimensionskonflikt"
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
ich diesen Fehler erhalten:
Modell nicht probabiliy schätzt
indizierte Zuweisung Dimension Mismatch unterstützen.
Fehler in comp (Zeile 98)
prob (:, k) = p (:, Modell {k} .Label == 1); % # Wahrscheinlichkeit der Klasse == k
bitte, hilf mir diesen Fehler und Dank im Voraus zu lösen
Ich denke, der Fehler ist in Zeile 'numLabels = max (yapp); '. In dieser Zeile sagt man im Grunde, dass es 1100 Etiketten gibt, während dies inkorrekt ist, da Sie 5 Etiketten haben. Wenn "yapp = [641; 645; 1001; 1010; 1100]", dann ist die Anzahl der Klassen "length (yapp)", nicht "max (yapp)". – Alessiox
danke für die Antwort, zu klären: xapp repräsentieren Trainingssatz und xtest enthalten das Testset. Ich weiß, dass das Problem von dieser Zeile kommt. NumLabels = max (yapp); aber wenn ich Max durch Länge (yapp) ersetze, bekomme ich den gleichen Fehler. danke für jeden Vorschlag – aya
solltest du auch auf die Zeile 'double (yapp == k)' achten. Mit 'k', das von 1 zu' numLabels' und 'yapp' geht, die im Bereich' [641; 645; 1001; 1010; 1100] 'liegen, wird diese Gleichheit niemals verifiziert. Ich denke nicht, dass dies den Fehler entfernen wird, aber Sie werden für alle Klassen nur Null-Labels erhalten und dies wird niemals zu korrekten Ergebnissen führen. – Alessiox