Linearly Non-Separable Binary Classification Problem
Prima di tutto, questo programma non funziona correttamente per RBF (gaussianKernel()) e voglio correggerlo.SVM di base implementato in MATLAB
Si tratta di una Demo SVM non lineare per illustrare la classificazione di 2 classi con l'applicazione di margine duro.
Il problema riguarda dati bidimensionali casuali distribuiti in modo radiale.
ho usato Quadratic Programmazione Risolutore per calcolare Lagrange moltiplicatori (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);
- per risolvere questo problema non classificazione lineare, ho scritto alcune funzioni del kernel, come gaussiana (RBF), funzioni kernel polinomiali omogenee e non omogenee.
Per RBF, ho implementato la funzione nell'immagine qui sotto:
Utilizzando Tylor di espansione della serie, se ne ricava:
E, io seperated il gaussiano kernel come questo:
K (x, x ') = phi (x)' * phi (x ')
L'attuazione di questo pensiero è:
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
*** credo che la mia implementazione RBF è sbagliato, ma io don' t know come risolvere il problema. Per favore aiutami qui.
Ecco cosa ho ottenuto come output:
dove,
1) la prima immagine: Campioni di classi
2) La seconda immagine: Marcatura I vettori di supporto delle classi
3) La terza immagine: Aggiunta di dati di test a caso
4) La quarta immagine: Classificazione
Inoltre, ho implementato omogenea polinomiale Kernel "K (x, x ') =()^2", il codice è:
function phi = quadraticKernel(x) % 2-Order Homogenous Polynomial Kernel phi = [x(:, 1).^2, sqrt(2).*(x(:, 1).*x(:, 2)), x(:, 2).^2]; end
e ho avuto sorprendentemente bello di uscita:
In sintesi, il programma funziona correttamente con l'utilizzo omogeneo kernel polinomiale, ma quando uso RBF, isn' t funzionare correttamente, c'è qualcosa di sbagliato con l'attuazione RBF.
Se sai di RBF (gaussiana Kernel) per favore fatemi sapere come posso fare bene ..
Edit: Se avete lo stesso problema, utilizzare RBF direttamente che definito sopra e non lo séparé dal phi.
Perché usi margine duro? Per quanto ne so, l'utilizzo di un margine difficile spesso è facilmente commettere errori in una singola classe. Btw hai regolato i parametri? – Jake0x32
Non ho esperienza come hai detto tu; ma a causa dell'impostazione del problema, ho generato dati di esempio da separare senza errori, quindi Support Vector Machine potrebbe essere in grado di classificare le classi senza definire alcun tipo di errore, è per questo che ho usato un margine difficile. E, la varianza del kernel RBF ("sigma2 = 2" nel programma) è grande per questa applicazione, lo so, ma non posso regolare questo parametro. Penso che il problema sia dovuto alla mia funzione gaussianKernel(). Devo averlo implementato in modo errato, e non so come correggerlo. – mehmet
Per quanto ne so, quando si usa il kernel Rbf possiamo sempre provare la ricerca della griglia provando i parametri in modo esponenziale, sia su C che su gamma, dove è una griglia 2-D utilizzata per cercare il modello migliore. Sono sempre fiducioso della capacità di Gaussian Kernel purché abbia un buon parametro. – Jake0x32