当我运行下面提到的SVM分类器(One against all)代码时,我在行中得到以下错误:model{k} = svmtrain(double(trainLabel==k), trainData, '-c 1 -g 0.2 -b 1');
在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 :(得分:0)
我猜这是路径问题。在你成功使用make
文件后,确保程序在libsvm / matlab路径下运行,但不要在里面添加你自己的文件夹。
还在Matlab中设置路径:
file-> set path->(select)使用子文件夹 - >(找到你的libsvm文件夹)OK-> save->关闭设置路径。
我认为它应该有用。试一试,谢谢。
答案 1 :(得分:0)
您正在混合使用libsvm库中的svmtrain
函数与Matlab Statistics Toolbox中包含的相同名称的函数。
在libsvm库中,svmtrain
的第三个输入是一个包含类似命令行的选项的字符串。在Matlab的版本中,使用名称/值对设置选项。您使用的字符串'-c 1 -g 0.2 -b 1'
表示成本参数= 1,径向基函数内核的伽马参数= 0.2,您正在请求概率估计。要在Matlab实现中使用相同的SVM,我认为您必须指定选项'boxconstraint', 1, 'kernel_function' 'rbf', 'rbf_sigma', 0.2
。 Matlab实现不支持概率估计。
但是,由于您要使用的代码显然基于libsvm库,因此最简单的方法是安装libsvm。