Основен 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 Series Expansion, той дава:

RBG с Tylor Expansion

И разделих ядрото на Gaussian така:

K(x, x') = phi(x)' * phi(x')

Изпълнението на тази мисъл е:

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 и не го разделяйте с phi.


person mehmet    schedule 11.11.2014    source източник
comment
Защо използвате твърд марж? Доколкото знам, използването на твърд марж често е лесно да се правят грешки в един клас. Btw настроихте ли параметрите?   -  person Jake0x32    schedule 11.11.2014
comment
Нямам опит, както споменахте; но поради настройката на проблема, генерирах примерни данни за seperable без грешка, така че Support Vector Machine може да може да класифицира класовете, без да дефинира какъвто и да е вид грешка, затова използвах твърд марж. И вариацията на RBF Kernel (sigma2 = 2 в програмата) е голяма за това приложение, знам, но не мога да коригирам този параметър. Мисля, че тук проблемът се дължи на моята функция gaussianKernel(). Сигурно съм го внедрил погрешно и не знам как да го коригирам..   -  person mehmet    schedule 12.11.2014
comment
Доколкото знам, когато използваме ядрото на Rbf, винаги можем да опитаме търсене в мрежа, като опитаме експоненциално нарастващи параметри, както на C, така и на гама, където има 2-D мрежа, използвана за търсене на най-добрия модел. Винаги съм уверен в капацитета на Gaussian Kernel, стига да има добър параметър.   -  person Jake0x32    schedule 12.11.2014


Отговори (2)


Защо искате да изчислите phi за Gaussian Kernel? Phi ще бъде безкрайномерен вектор и вие ограничавате членовете във вашата серия Тейлър до 10, когато ние дори не знаем дали 10 е достатъчно, за да приближим стойностите на ядрото или не! Обикновено ядрото се изчислява директно, вместо да се получава phi (и изчислителното k). Например [1].

Това означава ли, че никога не трябва да изчисляваме фи за Гаус? Не наистина, не, но трябва да бъдем малко по-умни в това отношение. Има скорошни работи [2,3], които показват как да се изчисли phi за Gaussian, така че да можете да изчислите приблизителни матрици на ядрото, докато имате само крайномерни phi. Тук [4] давам много простия код за генериране на приблизителното ядро, използвайки трика от статията. В моите експерименти обаче трябваше да генерирам някъде от 100 до 10 000 дименсионални phi, за да мога да получа добро приближение на ядрото (в зависимост от броя характеристики, които оригиналният вход имаше, както и от скоростта, с която собствените стойности на оригиналната матрица се стеснява).

За момента просто използвайте код, подобен на [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