2014-03-05 85 views
1

我在MatLab中使用LIBSVM來嘗試對圖像進行分類。在MatLab中使用LIBSVM進行多類圖像分類

我知道SVM是一個二進制分類模型,但是我想知道如何使用它作爲多類分類模型。

是否可以訓練數據對(即汽車和非汽車,馬和非馬,人和非人),然後通過將圖像與所有三種模型進行比較來預測圖像屬於哪一類?如果是這樣,我怎麼能做到這一點?我的測試標籤向量是什麼?

+1

感謝您的答覆。在我上面提到的情況下 - 生成了3個模型後,我會對每個模型執行svmpredict三次,並接受預測準確度最高的模型? – Gwenji

+0

是正確的 – Dan

回答

1

由於@丹的補充答案,下面是我以前post相關代碼:

model = cell(NumofClass,1); % NumofClass = 3 in your case 
for k = 1:NumofClass 
    model{k} = svmtrain(double(trainingLabel==k), trainingData, '-c 1 -g 0.2 -b 1'); 
end 

%% calculate the probability of different labels 

pr = zeros(1,NumofClass); 
for k = 1:NumofClass 
    [~,~,p] = svmpredict(double(testLabel==k), testData, model{k}, '-b 1'); 
    pr(:,k) = p(:,model{k}.Label==1); %# probability of class==k 
end 

%% your label prediction will be the one with highest probability: 

[~,predctedLabel] = max(pr,[],2); 
+0

感謝您的幫助。你能解釋一下爲什麼你使用'double(trainingLabel == k)'而不是'double(trainingLabel)'?另外 - 在生成模型時,我使用15個說汽車的實例(1個在訓練標籤的相應位置)和15個非汽車實例(-1在訓練標籤的相應位置)。我可以爲每個非實例的非實例使用相同的15個隨機對象 - 即非馬,非人? – Gwenji

+0

謝謝格文吉。 trainingLabel == K表示您希望獲得模型預測您的實例屬於K的概率,然後選擇具有最大概率的K數。你的問題二,答案是肯定的。 – lennon310

+0

最後一個問題 - 涉及到運行'svmpredict'時,我說我有一班20輛車,我想決定他們屬於哪三個班級 - 我可以使用20輛車和20個測試標籤矢量「1」 的?或者我必須使用20輛汽車和20輛非汽車才能使用40'1s和-1s'的測試標籤矢量?非常感謝您的幫助。 – Gwenji

2

是的,你的建議是一個好方法。它被稱爲one-vs-all strategy

您需要爲每個班級分別訓練SVM。輸出數據將是一個二進制變量,如果在該類中則爲1,否則爲0。然後,爲了對新項目進行分類,請通過每個SVM進行分類,並選擇輸出最高的輸出(輸出最接近1)。