libsvm liblinear如何使用直方图交集/卡方内核

时间:2012-09-14 09:44:28

标签: image-processing computer-vision svm libsvm pattern-recognition

是否可以在LIBLINEAR中使用直方图交叉/ chi sauare内核?

我的问题是我有一个5000大小的特征向量都是直方图功能。我不知道如何使用SVM进行训练/测试。

如何使用SVM进行训练?

libSVM支持4种类型的内核。

    0 -- linear: u'*v
1 -- polynomial: (gamma*u'*v + coef0)^degree
2 -- radial basis function: exp(-gamma*|u-v|^2)
3 -- sigmoid: tanh(gamma*u'*v + coef0)

在这种情况下,LibSVM支持线性内核libSVM和linearSVM之间的区别是什么?

4 个答案:

答案 0 :(得分:3)

不,你不能在liblinear中使用自定义内核。

要执行您想要执行的操作,您需要使用LibSVM和“预先计算的内核”选项,您可以在其中提供克数矩阵(这在LibSVM自述文件中有所描述)。

在线性内核的情况下,LibSVM和LibLinear产生类似的结果。作者说:

  

他们的预测相似但超平面不同。 LIBSVM   解决L1损失SVM,但是liblinear解决了L2正则化逻辑   回归和L2损失SVM。

答案 1 :(得分:1)

有点晚了,但可能会帮助别人:机器学习包scikit-learn(http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.chi2_kernel.html#sklearn.metrics.pairwise.chi2_kernel)至少提供了chi2-kernel。

答案 2 :(得分:0)

只有在明确将要素映射到非线性要素空间时,才能使用线性SVM求解器,我建议阅读:

  1. "用于检测的最​​大边际添加剂分类器" - http://www.cs.berkeley.edu/~smaji/papers/mcd-free-lunch-iccv-09.pdf
  2. "大规模内核机器的随机特性" - http://berkeley.intel-research.net/arahimi/papers/rahimi-recht-random-features.pdf
  3. "通过显式特征映射提供高效的附加内核" - http://www.vlfeat.org/~vedaldi/assets/pubs/vedaldi11efficient.pdf

答案 3 :(得分:0)

我最近在Libsvm中使用了chi2内核。我在这里粘贴代码,希望它有用。

function [chi2_ans]=chi2_kernel(x,y)
   f=@(x,y) 1-sum(((x'-y').*(x'-y'))./(x'+y'+eps)*2);
   [m, ~]=size(x);
   chi2_ans=zeros(size(x,1),size(y,1));
   for i=1:size(x,1)
        veci=x(i,:);
         for j=1:size(y,1)
            vecj=y(j,:);
            chi2_ans(i,j)=f(veci,vecj);
        end 
   end
end

并使用它。

function [ acc ] = singleChi2Kernel(   trainData,testData,trainLabel,testLabel )

numTrain = size(trainData,1);
numTest = size(testData,1);


%# compute kernel matrices between every pairs of (train,train) and
%# (test,train) instances and include sample serial number as first column
K =  [ (1:numTrain)' , chi2_kernel(trainData,trainData) ];
KK = [ (1:numTest)'  , chi2_kernel(testData,trainData)  ];

%# train and test
model = svmtrain(trainLabel, K, '-t 4  ');
[predClass, acc, decVals] = svmpredict(testLabel, KK, model);

%# confusion matrix
%C = confusionmat(testClass,predClass)

end

来自link

的代码