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:
Korzystanie Tylor Series Expansion, to plony:
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:
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:
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.
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
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
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