2014-11-11 23 views
5
Linearly Non-Separable Binary Classification Problem 

Po pierwsze, ten program nie działa poprawnie dla RBF (gaussianKernel()) i chcę go naprawić.Podstawowy SVM wdrożony w MATLAB

Jest to nieliniowa demonstracja SVM w celu zilustrowania klasyfikacji klasy 2 za pomocą twardego marginesu.

  • Problem dotyczy dwuwymiarowych, radialnych, przypadkowych, rozproszonych danych.

  • kiedyś kwadratowa programowania Solver obliczyć Lagrange'a mnożników (wartości alfa)

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); 
  • W celu rozwiązania tego braku problemu klasyfikacji, liniowy pisałem pewne funkcje w jądrze, takie jak Gaussa (RBF), jednorodne i niejednorodne wielomianowe funkcje jądra.

Do RBF, I wdrożone funkcję w obrazek poniżej:

Gaussian Kernel

Korzystanie Tylor Series Expansion, to plony:

RBG with Tylor Expansion

A ja oddzielone Gaussa Kernel takiego:

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

Realizacja tej myśli jest:

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 

*** Myślę, że moja realizacja RBF jest źle, ale ja nie wiem jak to naprawić. Proszę, pomóżcie mi tutaj.

Oto co mam na wyjściu:

Samples of ClassesMarking The Support Vectors of Classes

Adding Random Test DataClassification

gdzie

1) Pierwszy obraz: Próbki klas
2) drugi obraz: Znakowanie wektory wspierająca klas
3) trzeci obraz Dodanie losowe dane testowe
4) czwarty obraz Klasyfikacja

Ponadto, realizowane Jednorodna Polinomial Kernel "K (x, x ') =()^2”, kod jest:

function phi = quadraticKernel(x) 

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

end 

I mam zaskakująco piękny wynik:

quadratic kernel output 1quadratic kernel output 1

Podsumowując, program działa poprawnie z użyciem jądra wielomian jednorodny ale kiedy używam RBF, to nieprawdaż t działa prawidłowo, coś jest nie tak z realizacji RBF.

Jeśli wiesz o RBF (Gaussa Kernel) proszę dać mi znać, jak mogę to naprawić ..

Edycja: Jeśli masz ten sam problem, należy użyć bezpośrednio RBF, że podane powyżej, a nie separacji go przez phi.

+0

Dlaczego używacie twardego margines? O ile mi wiadomo, używanie twardego marginesu często jest łatwe do popełnienia błędów na jednej klasie. Btw czy dostroiłeś parametry? – Jake0x32

+0

Nie mam takiego doświadczenia jak wspomniałeś; ale ze względu na ustawienie problemu generowałem przykładowe dane do seperacji bez błędów, więc Maszyna Vector może być w stanie sklasyfikować klasy bez definiowania jakiegokolwiek błędu, dlatego użyłem twardego marginesu. I, wariancja jądra RBF ("sigma2 = 2" w programie) jest duża dla tej aplikacji, wiem, ale nie mogę zmienić tego parametru. Myślę, że tutaj problem wynika z mojej funkcji gaussianKernel(). Musiałem go źle wdrożyć i nie wiem, jak to poprawić. – mehmet

+0

O ile mi wiadomo, używając jądra Rbf możemy zawsze spróbować wyszukiwania w sieci, próbując wykładniczo rosnących parametrów, zarówno na C jak i gamma, gdzie jest siatką 2D używaną do wyszukiwania najlepszego modelu. Zawsze jestem przekonany co do pojemności jądra Gaussa, o ile ma on dobry parametr. – Jake0x32

Odpowiedz

1

Dlaczego chcesz obliczyć phi dla jądra Gaussa? Phi będzie nieskończonym wektorem wymiarowym i ograniczasz warunki w twojej serii Taylor do 10, kiedy nie wiemy nawet, czy 10 wystarczy, aby zbliżyć wartości jądra, czy nie! Zwykle jądro jest obliczane bezpośrednio, zamiast uzyskiwać phi (i obliczanie k). Na przykład [1].

Czy to oznacza, że ​​nigdy nie powinniśmy obliczać phi dla Gaussa? Nie bardzo, nie, ale musimy być nieco mądrzejsi. Były ostatnio prace [2,3], które pokazują, w jaki sposób obliczyć phi dla Gaussa, abyś mógł obliczyć przybliżone macierze jądra mając tylko skończony wymiarowy phi. Tutaj [4] podaję bardzo prosty kod, aby wygenerować przybliżone jądro, wykorzystując sztuczkę z papieru. Jednak w moich eksperymentach musiałem wygenerować od 100 do 10000 wymiarów phi, aby uzyskać dobre przybliżenie jądra (w zależności od liczby funkcji, które posiadał oryginalny sygnał wejściowy, oraz szybkości, z jaką wartości własne oryginalna matryca zwęża się).

Na razie wystarczy użyć kodu podobnego do [1], aby wygenerować jądro Gaussa, a następnie obserwować wynik SVM. Ponadto, baw się z parametrem gamma, zły parametr gamma może spowodować naprawdę złą klasyfikację.

[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

1

Ponieważ jądro Gaussa jest często określane jako mapowanie do wymiarów nieskończoności, zawsze wierzę w jego możliwości. Problem może być tutaj spowodowany złym parametrem, a przy wyszukiwaniu SVM zawsze jest potrzebne wyszukiwanie siatki. Dlatego proponuję, abyście mogli spojrzeć na here, gdzie można znaleźć kilka sztuczek do dostrajania parametrów. Wykładniczo rosnąca sekwencja jest zazwyczaj używana jako kandydat.

Powiązane problemy