2013-03-22 41 views
0

有人可以幫我解決這個問題嗎? 我想測試這種分類是否已經很好。所以,我嘗試使用數據測試=數據培訓。如果分類好,它會給100%(acc)。 這是我從這個網站上找到的代碼:在matlab中測試libsvm時效果不佳

data= [170   66   ; 
160   50   ; 
170   63   ; 
173   61   ; 
168   58   ; 
184   88   ; 
189   94   ; 
185   88   ] 

labels=[-1;-1;-1;-1;-1;1;1;1]; 

numInst = size(data,1); 
numLabels = max(labels); 

testVal = [1 2 3 4 5 6 7 8]; 
    trainLabel = labels(testVal,:); 
    trainData = data(testVal,:); 
    testData=data(testVal,:); 
    testLabel=labels(testVal,:); 
numTrain = 8; numTest =8 

%# train one-against-all models 
model = cell(numLabels,1); 
for k=1:numLabels 
    model{k} = svmtrain(double(trainLabel==k), trainData, '-c 1 -t 2 -g 0.2 -b 1'); 
end 

%# get probability estimates of test instances using each model 
prob = zeros(numTest,numLabels); 
for k=1:numLabels 
    [~,~,p] = svmpredict(double(testLabel==k), testData, 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 == testLabel) ./ numel(testLabel) %# accuracy 
C = confusionmat(testLabel, pred)     %# confusion matrix 

,這是結果:

optimization finished, #iter = 16 
nu = 0.645259 obj = -2.799682, 
rho = -0.437644 nSV = 8, nBSV = 1 Total nSV = 8 
Accuracy = 100% (8/8) (classification) 

acc = 

    0.3750 


C = 

    0  5 
    0  3 

我不知道爲什麼有兩大準確性,及其不同。第一個是100%,第二個是0.375。我的代碼是否爲假?它應該是100%而不是37.5%。你能幫我糾正這個代碼嗎?

回答

1

是你使用的代碼嗎?我不認爲你的svmtrain調用是有效的。你應該有svmtrain(MAT, VECT, ...)其中MAT是一個數據矩陣,VECT是一個向量,每行的標籤爲MAT。其餘參數是字符串值對,這意味着您將擁有一個字符串標識符及其相應的值。

當我運行你的代碼(Linux,R2011a)時,我在svmtrain調用中出錯。運行svmtrain(trainData, double(trainLabel==k))給出了有效的輸出(對於該行)。當然,看起來你並沒有使用純matlab,因爲你的svmpredict調用不是原生matlab,而是一個來自LIBSVM的matlab綁定...

+0

對不起呀亞姆不提,我用libsvm的。在這裏我使用LIBSVM。 – user2157806 2013-03-23 01:51:41

2

如果你使用libsvm,那麼你應該改變它的名字MEX文件,因爲Matlab已經有一個名爲svmtrain的svm工具箱。但是,代碼正在運行,因此您似乎更改了名稱,而不是您提供的代碼。

第二個錯了,不知道到底爲什麼。但是,我可以告訴你,如果使用test_Data = training_Data,幾乎總能獲得100%的準確性。這個結果實際上並不意味着什麼,因爲算法可能會過度使用,而不會顯示在結果中。根據新數據測試你的算法,這會給你一個現實的準確性。

1

C = confusionmat(testLabel,PRED)
交換它們的位置

C = confusionmat(預解碼值,testLabel)

或使用本

[ConMat,爲了] = confusionmat(預解碼值, testLabel)

示出了混淆矩陣和類順序

0

的問題是在

[~,~,p] = svmpredict(double(testLabel==k), testData, model{k}, '-b 1'); 

p不包含預測標籤,它具有標籤的概率估計是正確的。 LIBSVM的svmpredict已經正確計算出準確度,這就是爲什麼它在調試輸出中表示100%。 解決方法是簡單的:

[p,~,~] = svmpredict(double(testLabel==k), testData, model{k}, '-b 1'); 

根據LIBSVM的Matlab的綁定自述:

The function 'svmpredict' has three outputs. The first one, 
predictd_label, is a vector of predicted labels. The second output, 
accuracy, is a vector including accuracy (for classification), mean 
squared error, and squared correlation coefficient (for regression). 
The third is a matrix containing decision values or probability 
estimates (if '-b 1' is specified). If k is the number of classes 
in training data, for decision values, each row includes results of 
predicting k(k-1)/2 binary-class SVMs. For classification, k = 1 is a 
special case. Decision value +1 is returned for each testing instance, 
instead of an empty vector. For probabilities, each row contains k values 
indicating the probability that the testing instance is in each class. 
Note that the order of classes here is the same as 'Label' field 
in the model structure. 
0

我很遺憾地告訴大家,所有的答案是完全錯誤的! 在代碼完成的主要錯誤是:

numLabels = max(labels); 

,因爲它返回(1),雖然它應該返回2,如果標籤是正數,然後svmtrain去/ svmpredict將循環兩次。

無論如何,變線labels=[-1;-1;-1;-1;-1;1;1;1];labels=[2;2;2;2;2;1;1;1]; ,它會成功運行;)