Базовый SVM, реализованный в MATLAB

  Linearly Non-Separable Binary Classification Problem

Прежде всего, эта программа неправильно работает с RBF ( gaussianKernel() ), и я хочу это исправить.

Это нелинейная демонстрация SVM, иллюстрирующая классификацию класса 2 с применением жесткого поля.

  • Проблема связана с двумерными радиально-случайными распределенными данными.

  • Я использовал Quadratic Programming Solver для вычисления множителей Лагранжа (альфа).

xn    = input .* (output*[1 1]);    % xiyi
phi   = gaussianKernel(xn, sigma2); % Radial Basis Function

k     = phi * phi';                 % Symmetric Kernel Matrix For QP Solver
gamma = 1;                          % Adjusting the upper bound of alphas
f     = -ones(2 * len, 1);          % Coefficient of sum of alphas
Aeq   = output';                    % yi
beq   = 0;                          % Sum(ai*yi) = 0
A     = zeros(1, 2* len);           % A * alpha <= b; There isn't like this term
b     = 0;                          % There isn't like this term
lb    = zeros(2 * len, 1);          % Lower bound of alphas
ub    = gamma * ones(2 * len, 1);   % Upper bound of alphas

alphas = quadprog(k, f, A, b, Aeq, beq, lb, ub);
  • Чтобы решить эту проблему нелинейной классификации, я написал некоторые функции ядра, такие как гауссовские (RBF), однородные и неоднородные полиномиальные функции ядра.

Для RBF я реализовал функцию на изображении ниже:

Гауссовское ядро

Используя расширение серии Tylor, это дает:

RBG с расширением Tylor

И я отделил ядро ​​Гаусса следующим образом:

К(х, х') = фи(х)' * фи(х')

Реализация этой мысли такова:

function phi = gaussianKernel(x, Sigma2)

gamma   = 1 / (2 * Sigma2);
featDim = 10; % Length of Tylor Series; Gaussian Kernel Converge 0 so It doesn't have to Be Inf Dimension
phi     = []; % Kernel Output, The Dimension will be (#Sample) x (featDim*2)

    for k = 0 : (featDim - 1) 

        % Gaussian Kernel Trick Using Tylor Series Expansion
        phi = [phi, exp( -gamma .* (x(:, 1)).^2) * sqrt(gamma^2 * 2^k / factorial(k)) .* x(:, 1).^k, ...
            exp( -gamma .* (x(:, 2)).^2) * sqrt(gamma^2 * 2^k / factorial(k)) .* x(:, 2).^k];
    end

end

*** Я думаю, что моя реализация RBF неверна, но я не знаю, как это исправить. Пожалуйста, помогите мне здесь.

Вот что я получил на выходе:

Образцы классовРазметка опорных векторов классов

Добавление случайных тестовых данныхКлассификация

куда,

1) Первое изображение: Образцы классов
2) Второе изображение: Маркировка опорных векторов классов
3) Третье изображение: Добавление случайных тестовых данных
4) Четвертое изображение: Классификация

Кроме того, я реализовал однородное полиномиальное ядро ​​« K (x, x ') = ( ) ^ 2 », код:

function phi = quadraticKernel(x)

    % 2-Order Homogenous Polynomial Kernel
    phi = [x(:, 1).^2, sqrt(2).*(x(:, 1).*x(:, 2)), x(:, 2).^2];

end

И я получил удивительно хороший результат:

квадратный вывод ядра 1вывод квадратичного ядра 1

Подводя итог, программа работает правильно с использованием однородного полиномиального ядра, но когда я использую RBF, она работает неправильно, что-то не так с реализацией RBF.

Если вы знаете о RBF (Gaussian Kernel), пожалуйста, дайте мне знать, как я могу это исправить.

Редактировать: если у вас такая же проблема, используйте RBF напрямую, как указано выше, и не разделяйте его по фи.


person mehmet    schedule 11.11.2014    source источник
comment
Почему вы используете жесткую маржу? Насколько мне известно, при использовании жесткого поля часто легко допустить ошибку в одном классе. Кстати, вы настроили параметры?   -  person Jake0x32    schedule 11.11.2014
comment
У меня нет такого опыта, как вы упомянули; но из-за настройки проблемы я сгенерировал образцы данных для разделения без ошибок, поэтому машина опорных векторов могла бы классифицировать классы без определения какой-либо ошибки, поэтому я использовал жесткую маржу. Да и дисперсия RBF Kernel (sigma2=2 в программе) для этого приложения большая, я знаю, но настроить этот параметр не могу. Я думаю, что здесь проблема связана с моей функцией gaussianKernel(). Я, должно быть, реализовал это неправильно, и я не знаю, как это исправить.   -  person mehmet    schedule 12.11.2014
comment
Насколько мне известно, при использовании ядра Rbf мы всегда можем попробовать поиск по сетке, пробуя экспоненциально возрастающие параметры как для C, так и для гаммы, где для поиска лучшей модели используется двумерная сетка. Я всегда уверен в мощности Gaussian Kernel, если у него хорошие параметры.   -  person Jake0x32    schedule 12.11.2014


Ответы (2)


Почему вы хотите вычислить фи для ядра Гаусса? Phi будет бесконечномерным вектором, и вы ограничиваете члены своего ряда Тейлора до 10, когда мы даже не знаем, достаточно ли 10 для аппроксимации значений ядра или нет! Обычно ядро ​​вычисляется напрямую вместо получения phi (и вычисления k). Например [1].

Означает ли это, что мы никогда не должны вычислять фи для Гаусса? Не совсем, нет, но мы должны быть немного умнее в этом отношении. Недавно были опубликованы работы [2,3], в которых показано, как вычислить фи для гауссова, чтобы можно было вычислять приближенные матрицы ядра, имея только конечномерные фи. Здесь [4] я даю очень простой код для генерации приблизительного ядра, используя прием из статьи. Однако в моих экспериментах мне нужно было сгенерировать где-то от 100 до 10000 размерных фи, чтобы иметь возможность получить хорошее приближение к ядру (в зависимости от количества признаков исходного ввода, а также от скорости, с которой собственные значения исходная матрица сужается).

На данный момент просто используйте код, аналогичный [1], для генерации ядра Гаусса, а затем наблюдайте за результатом SVM. Кроме того, поэкспериментируйте с параметром гаммы, плохой параметр гаммы может привести к очень плохой классификации.

[1] https://github.com/ssamot/causality/blob/master/matlab-code/Code/mfunc/indep/HSIC/rbf_dot.m

[2] http://www.eecs.berkeley.edu/~brecht/papers/07.rah.rec.nips.pdf

[3] http://www.eecs.berkeley.edu/~brecht/papers/08.rah.rec.nips.pdf

[4] https://github.com/aruniyer/misc/blob/master/rks.m

person TenaliRaman    schedule 15.11.2014

Поскольку ядро ​​Гаусса часто называют отображением в бесконечные измерения, я всегда верю в его возможности. Проблема здесь может быть связана с неверным параметром, хотя поиск по сетке всегда необходим для обучения SVM. Поэтому я предлагаю вам взглянуть на здесь где вы можете найти некоторые приемы для настройки параметров. В качестве кандидатов обычно используется экспоненциально возрастающая последовательность.

person Jake0x32    schedule 12.11.2014