2013-12-20 99 views
3

當運行下面提到SVM分類(一個針對全部)代碼我得到以下錯誤在該行:model{k} = svmtrain(double(trainLabel==k), trainData, '-c 1 -g 0.2 -b 1');SVM一個分類器對所有

在matlab中:Y必須是一個載體或一個字符數組。

任何人都可以幫助我嗎?

The code is: 
%# Fisher Iris dataset 
load fisheriris 
[~,~,labels] = unique(species); %# labels: 1/2/3 
data = zscore(meas);    %# scale features 
numInst = size(data,1); 
numLabels = max(labels); 

%# split training/testing 
idx = randperm(numInst); 
numTrain = 100; numTest = numInst - numTrain; 
trainData = data(idx(1:numTrain),:); testData = data(idx(numTrain+1:end),:); 
trainLabel = labels(idx(1:numTrain)); testLabel = labels(idx(numTrain+1:end)); 

這裏是一對,所有的方法對多類SVM實現:

%# train one-against-all models 
model = cell(numLabels,1); 
for k=1:numLabels 
    model{k} = svmtrain(double(trainLabel==k), trainData, '-c 1 -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 

回答

0

我想這是路徑問題。在成功完成mex make文件後,請確保程序在libsvm/matlab路徑下運行,但不要在其中添加自己的文件夾。

而且設置在Matlab路徑:

文件 - >設置路徑 - >(選擇),並與子文件夾 - >(找到你libsvm的文件夾)確定 - > save->接近設定的路徑。

我認爲它應該工作。試試看,謝謝。

+0

@ Lennon:謝謝你的答覆。在這裏,我沒有使用libSVM。請幫我解決這個問題。 –

+0

YUVARAJ,svmtrain,svmpredict等函數都是libsvm。你使用哪個軟件包? – lennon310

+0

:我沒有使用任何包。實際上,我從互聯網上獲得了這個代碼。只是我嘗試運行。請你幫我解決這個錯誤。 –

0

您正在混合使用來自libsvm函數庫的函數svmtrain與Matlab的Statistics Toolbox中包含的同名函數的使用。

在libsvm庫中,svmtrain的第三個輸入是一個包含類似命令行選項的字符串。在Matlab的版本中,選項使用名稱/值對進行設置。您使用的字符串'-c 1 -g 0.2 -b 1'表示成本參數= 1,徑向基函數內核的gamma參數= 0.2,並且您正在請求概率估計值。要在Matlab實現中使用相同的SVM,我想認爲您必須指定選項'boxconstraint', 1, 'kernel_function' 'rbf', 'rbf_sigma', 0.2。儘管Matlab實現不支持概率估計。

但是,由於您要使用的代碼顯然是基於libsvm庫,因此使其工作的最簡單方法是安裝libsvm。