libsvm liblinear как использовать ядра пересечения гистограммы/хи-квадрат

Можно ли использовать пересечение гистограммы / ядра chi sauare в LIBLINEAR?

Моя проблема в том, что у меня есть вектор признаков размером 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?


person user570593    schedule 14.09.2012    source источник


Ответы (4)


Нет, вы не можете использовать собственные ядра в liblinear.

Чтобы сделать то, что вы хотите сделать, вам нужно будет использовать LibSVM и опцию «предварительно вычисленное ядро», где вы указываете матрицу граммов (это описано в файле README LibSVM).

В случае линейных ядер LibSVM и LibLinear дают аналогичные результаты. Автор говорит так:

Их предсказания похожи, но гиперплоскости разные. Libsvm решает SVM с потерями L1, но liblinear решает логистическую регрессию с регуляризацией L2 и SVM с потерями L2.

person Community    schedule 14.09.2012

Немного поздно, но может помочь другим: пакет машинного обучения scikit-learn (http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.chi2_kernel.html#sklearn.metrics.pairwise.chi2_kernel) предлагает как минимум чи2-ядро.

person lu_siyah    schedule 08.07.2013

Вы можете использовать линейный решатель SVM, только если вы явно сопоставляете свои функции с нелинейным пространством функций, я рекомендую прочитать:

  1. «Аддитивные классификаторы Max-Margin для обнаружения» — 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
person ksopyla    schedule 28.11.2012

Я просто использую ядро ​​​​chi2 в Libsvm в этот день. Я вставляю код здесь, надеюсь, он может быть полезен.

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

код из ссылки

person user7228498    schedule 19.12.2016