Ich weiß, dass die SVM ein binärer Klassifikator ist. Ich würde es gerne auf SVM mit mehreren Klassen ausweiten. Welches ist der beste und vielleicht einfachste Weg, dies zu tun?
Code: in MATLAB
u=unique(TrainLabel);
N=length(u);
if(N>2)
itr=1;
classes=0;
while((classes~=1)&&(itr<=length(u)))
c1=(TrainLabel==u(itr));
newClass=double(c1);
tst = double((TestLabel == itr));
model = svmtrain(newClass, TrainVec, '-c 1 -g 0.00154');
[predict_label, accuracy, dec_values] = svmpredict(tst, TestVec, model);
itr=itr+1;
end
itr=itr-1;
end
Wie kann das verbessert werden?
machine-learning
matlab
svm
multi-class
Lakesh
quelle
quelle
classes
im Code? Es scheint nutzlos zu sein.Antworten:
Es gibt viele Methoden für die Klassifizierung mehrerer Klassen. Zwei klassische Optionen, die nicht SVM-spezifisch sind, sind:
One-vs-all (OVA) -Klassifikation:
Angenommen, Sie haben die Klassen A, B, C und D. Trainieren Sie statt einer Vier-Wege-Klassifikation vier Binärklassifikatoren: A gegen Nicht-A, B gegen Nicht-B , C gegen nicht-C und D gegen nicht-D. Wählen Sie dann entweder die positive Klasse aus, die "am besten" ist (z. B. über alle vier Läufe hinweg am weitesten vom Rand entfernt). Wenn keine der Klassifikationen positiv ist (dh sie sind alle nicht-X), wählen Sie das "Gegenteil" der Klasse, die am schlechtesten ist (z. B. am nächsten am Rand).
Alles gegen Alles:
Trainiere alle möglichen Klassifikationspaare. Ordnen Sie die Klassen nach einem bestimmten Faktor (z. B. Häufigkeit der Auswahl) und wählen Sie die beste aus.
Was am besten funktioniert, war umstritten: Duan und Keerthi haben eine empirische Studie, die eine spezifische All-gegen-All-Methode vorschlägt , während Rifkin und Klautau für ein Ein-gegen-All-Schema plädieren. Es gibt sogar Schemata, bei denen man anstelle der Bezeichnungen selbst fehlerkorrigierende Codes zur Beschreibung der Klassenbezeichnungen lernt.
Viel Glück!
Bearbeiten: Was Sie wirklich wollen, insbesondere für OVA, ist die hintere Wahrscheinlichkeit jeder Klasse. Für einige Methoden, wie Naive Bayes, ist es trivial, rauszukommen. SVMs geben normalerweise keine Wahrscheinlichkeiten an, aber es gibt Möglichkeiten, sie zu berechnen. Siehe John Platt 1999 "Probabilistic Outputs for Support Vector Machines ..."
quelle
Lassen Sie mich hinzufügen, dass an der Erweiterung von SVMs auf mehrere Klassen gearbeitet wird (im Gegensatz zu den von Matt Krause beschriebenen Methoden, bei denen es sich um die Zerlegung in mehrere binäre Klassifizierungsaufgaben handelt). Eine wichtige Arbeit ist: Über die algorithmische Implementierung von Multiclass-Kernel-basierten Vektormaschinen
quelle