2016-04-18 9 views
0

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

+0

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

+0

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

+0

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

Antwort

0

Was Sie versuchen zu tun ist, einen Code-Schnipsel zu verwenden, die eine SVM-Klassifikator Leistungen bewertet, während Ihr Ziel ist es, die Etiketten für Ihr Testset richtig einzuschätzen.

Ich nehme an, Ihre fünf Etiketten sind [641;645;1001;1010;1100] (wie in yapp). Als erstes müssen Sie ytest löschen, da Sie keine Labels für das Testset kennen. Es ist sinnlos, ytest mit einigen Dummy-Werten zu füllen: die SVMs werden unsere vorhergesagten Etiketten zurückgeben.

Der erste Fehler ist, wie bereits in den Kommentaren darauf hingewiesen, ist in

numLabels=max(yapp); 

Sie max() mit length() ändern müssen, um die Anzahl der Klassen zu sammeln.

Die Trainingsstufe ist fast korrekt.
Angesichts der Tatsache, dass k von 1 bis 5 geht, während yapp den Bereich oben hat, die man beachten sollte double(yapp==k) in double(yapp==yapp(k)) Wechsel: auf diese Weise markieren wir als positiv den k-Wert in yapp. Angesichts der Tatsache, dass k geht von 1 bis 5, dann wird yapp(k) von 641 bis 1100 gehen.

Und jetzt die Vorhersage.
Der erste Eingang für svmpredict() sollte die Testbeschriftungen sein, aber jetzt kennen wir sie nicht, so dass wir sie mit einem Vektor von Nullen füllen können (es wird so viele Nullen geben wie Muster im Testsatz vorhanden sind). Das liegt daran, dass svmpredict() die Genauigkeit automatisch zurückgibt, wenn die Testbeschriftungen bekannt sind, aber das ist nicht der Fall. So müssen Sie die zweite for-Schleife ändern

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 

und vorhersagen schließlich die Etiketten mit

[~,pred] = max(prob,[],2); 

und pred enthält die vorhergesagten Etiketten.

Hinweis 1: Bei dieser Methode können Sie jedoch die Genauigkeit und/oder andere Parameter nicht messen, da das, was wir Testset genannt haben, kein Testset ist. Ein Testset ist ein beschrifteter Satz und wir tun so, als ob wir seine Etiketten nicht kennen würden, damit die SVM sie vorhersagen und dann die vorhergesagten Etiketten mit den tatsächlichen Etiketten vergleichen kann, um ihre Genauigkeit zu messen.

Hinweis 2: Die vorhergesagten Labels in pred werden aufgrund der zweiten for-Schleife höchstwahrscheinlich Werte im Bereich 1 bis 5 haben. Da Ihre Etiketten jedoch unterschiedliche Werte haben, können Sie zurückversetzen unter Berücksichtigung, dass 1 641, 2 645, 3 1001, 4 1010, 5 1100 ist.

+0

Ich habe das versucht, aber ich bekomme eine Matrix pred als Kollege pred = [5; 5; 5; 5; 5], aber in Wirklichkeit sind die Klassenlabels in [641; 645; 1001; 1010; 1100]. Was ist das Problem genau? – aya

+0

@aya, lesen * Hinweis 2 * – Alessiox