【问题标题】:libsvm liblinear how to use histogram intersection/chi square kernelslibsvm liblinear 如何使用直方图交集/卡方内核
【发布时间】:2012-09-07 11:15:11
【问题描述】:

是否可以在 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 有什么区别?

【问题讨论】:

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


    【解决方案1】:

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

    要执行您想做的事情,您需要使用 LibSVM 和“预计算内核”选项,您可以在其中提供 gram 矩阵(这在 LibSVM README 中有描述)。

    在线性核的情况下,LibSVM 和 LibLinear 产生相似的结果。作者是这样说的:

    他们的预测相似,但超平面不同。 Libsvm 求解 L1 损失 SVM,但 liblinear 求解 L2 正则化逻辑 回归和 L2-loss SVM。

    【讨论】:

      【解决方案2】:

      只有当你明确地将你的特征映射到非线性特征空间时,你才能使用线性 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】:

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

        【讨论】:

          【解决方案4】:

          我这几天只是在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 的代码

          【讨论】:

            猜你喜欢
            • 2012-06-27
            • 1970-01-01
            • 1970-01-01
            • 2019-02-10
            • 2015-06-23
            • 2015-04-12
            • 2012-11-05
            • 2012-07-15
            • 2014-10-21
            相关资源
            最近更新 更多