我正在尝试使用预先计算的内核与libsvm(matlab)进行5倍交叉验证,但是,我收到以下错误消息: 未定义的功能' ge'对于类型' struct'的输入参数。 这是因为Libsvm在交叉验证中返回结构而不是值,如何解决这个问题,这是我的代码:
load('iris.dat')
data=iris(:,1:4);
class=iris(:,5);
% normalize the data
range=repmat((max(data)-min(data)),size(data,1),1);
data=(data-repmat(min(data),size(data,1),1))./range;
% train
tr_data=[data(1:5,:);data(52:56,:);data(101:105,:)];
tr_lbl=[ones(5,1);2*ones(5,1);3*ones(5,1)];
% kernel computation
sigma=.8
rbfKernel = @(X,Y,sigma) exp((-pdist2(X,Y,'euclidean').^2)./(2*sigma^2));
Ktr=[(1:15)',rbfKernel(tr_data,tr_data,sigma)];
kts=[ (1:150)',rbfKernel(data,tr_data,sigma)];
% svmptrain
bestcv = 0;
for log2c = -1:3
cmd = ['Ktr -t 4 -v 5 -c ', num2str(2^log2c)];
cv = svmtrain2(tr_lbl,tr_data, cmd);
if (cv >= bestcv)
bestcv = cv;
bestc = 2^log2c;
end
end
cmd=['-s 0 -c ', num2str(bestc), 'Ktr -t 4']
model=svmtrain2(tr_lbl,tr_data,cmd)
% svm predict
labels=svmpredict(class,data,model,kts)
答案 0 :(得分:0)
您使用的函数svmtrain2不是标准MATLAB的一部分,函数的输出也不是结构。但如果您坚持使用它,您可以使用其他现有功能计算数据分数:
[f,K] = svmeval(X_eval,varargin)
使用 svmtrain2 的输出评估经过训练的svm。但我更喜欢首先使用嵌入在MATLAB中的标准函数。在标准MATLAB库中有:
SVMStruct = svmtrain(Training,Group)
返回结构SVMStruct,其中包含有关受过训练的支持向量机(SVM)分类器的信息。或
SVMModel = fitcsvm(X,Y)
返回支持向量机分类器SVMModel,由预测变量X和类标签Y训练,用于一类或两类分类。然后你可以使用以下方法获得每个预测的分数:
[label,Score] = predict(SVMModel,X)
返回类别可能性度量,即得分或后验概率。
答案 1 :(得分:0)
您收到该错误是因为您正在尝试比较结构和数字。
如果你想要的是在训练集中找到最佳表现(从你的比较看来),我认为你不能直接从svmtrain
返回的结构中得到它。您应该首先将svmpredict
与训练集和训练模型一起使用,然后您可以从结果结构中获得准确性。