2016-11-07 4 views
0

Kann mir jemand helfen, den Fehler zu finden, dass der folgende Code nicht auf MATLAB konvergiert? Bitte beachten Sie, dass k Kernel bedeutet und eine eigene Funktion hat.SVM-SMO-Algorithmus-Implementierung in C++ oder MATLAB

Ich versuchte es mit dem Algorithmus in dem Bild zu implementieren:

enter image description here

Meine Implementierung:

while 1 

    num_changed_alphas = 0; 
    %step 4 
    if (Y .* alphas < B) 
    [Yigi , i_WS] = max(Y .* g) 
    end 
    %step 5 
    if (A < Y .* alphas) 
    [Yjgj , j_WS] = max(Y .* g) 
    end 
    %step 6 
    if ((Yigi - Yjgj) <= eps) 
     num_changed_alphas = num_changed_alphas + 1; 
     break; 

    end 
    %step 7 
    lambda = min (B(i_WS) - Y(i_WS) .* alphas(i_WS), Y(j_WS) .* alphas(j_WS) - A(j_WS)); 
    lambda = min (lambda, (Yigi - Yjgj) ./ (K(i_WS,i_WS) + K(j_WS,j_WS) - 2* K(j_WS,i_WS))); 

    g = sum (g - lambda .* Y .* K (:,i_WS) + lambda .* Y .* K (:,j_WS)); 

    alphas = alphas + Y * lambda; 

    fprintf('.'); 
    dots = dots + 1; 
    if dots > 75 
     dots = 0; 
     fprintf('\n'); 
    end 
    if exist('OCTAVE_VERSION') 
     fflush(stdout); 
    end 
end %while 
+0

Die SMO-Tag unter den Zeilen etwas tun ist für SQL Server-Verwaltungsobjekte. Ich denke nicht, dass das auf deine Frage zutrifft. Ich habe es entfernt und ein Tag für MatLab hinzugefügt. –

Antwort

1

Ein großer Fehler ist, dass

a = f (x) unterliegt g (x)

bedeutet nicht "wenn g (x), dann a = f (x)", sondern "a = f (x) unter Berücksichtigung nur solcher x, dass g (x) wahr ist".

so

if (Y .* alphas < B) 
    [Yigi , i_WS] = max(Y .* g) 
end 

(sowie nächste if) ist keine gültige Implementierung Betrieb

i = arg max SOMETHING subject to CONSTRAINTS 

Sie sollten

selected = (Y .* alphas < B) 
[Yigi , i_WS] = max(Y(selected) .* g(selected))