matlab中libsvm与预计算核的交叉验证

matlab中libsvm与预计算核的交叉验证,matlab,libsvm,cross-validation,Matlab,Libsvm,Cross Validation,我尝试使用预计算内核使用libsvm(matlab)进行5倍交叉验证,但得到以下错误消息: 类型为“struct”的输入参数的未定义函数“ge”。 这是因为Libsvm在交叉验证中返回的是一个结构而不是一个值,我如何解决这个问题,这是我的代码: load('iris.dat') data=iris(:,1:4); class=iris(:,5); % normalize the data range=repmat((max(data)-min(data)),size(data,1),1); d

我尝试使用预计算内核使用libsvm(matlab)进行5倍交叉验证,但得到以下错误消息: 类型为“struct”的输入参数的未定义函数“ge”。 这是因为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)

您使用的函数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) 

它返回类似然度量,即分数或后验概率。

之所以会出现这种错误,是因为您试图比较一个结构和一个数字


如果您希望在训练集中找到最佳性能(从您的比较中可以看出),我认为您无法直接从
svmtrain
返回的结构中获得它。您应该首先对训练集和训练模型使用
svmpredict
,然后可以从结果结构中获得准确性。

首先,您不应该定义名为“class”的变量。然后,您可以指定产生错误的行吗?我重命名了变量“class”,但这并没有解决问题,即第29行中的错误消息(如果(cv>=bestcv))。