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

Posted

技术标签:

【中文标题】libsvm 交叉验证与 matlab 中的预计算内核【英文标题】:libsvm cross validation with precomputed kernel in matlab 【发布时间】:2014-04-28 12:13:17 【问题描述】:

我正在尝试使用预计算内核对 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)

【问题讨论】:

首先,你不应该定义一个名为'class'的变量。那么,你能指定产生错误的行吗? 我重命名了变量 'class' 但这并没有解决问题,第 29 行的错误消息(if (cv >= bestcv))。 【参考方案1】:

你得到这个错误是因为你试图比较一个结构和一个数字。

如果您想要在训练集中找到最佳性能(从您的比较看来),我认为您不能直接从svmtrain 返回的结构中得到它。您应该首先将svmpredict 与训练集和训练好的模型一起使用,您可以从生成的结构中获得准确度。

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于libsvm 交叉验证与 matlab 中的预计算内核的主要内容,如果未能解决你的问题,请参考以下文章

在 libsvm matlab 中标记一个类以进行交叉验证

如何在 LibSVM 中实现十折交叉验证

libsvm java中的交叉验证准确性

如何在 C++ 中移植 MATLAB libSVM 参数

libsvm:C++ 与 MATLAB:不同的精度有何不同?

在 LIBSVM 中的 SVM 中进行交叉验证时停止打印准确性 [关闭]