2016-11-07 65 views
0

有人能幫我找到沒有以下代碼收斂在MATLAB上的錯誤嗎?請注意,k意味着內核並有其自己的功能。在C++或MATLAB上實現SVM-SMO算法

我嘗試在圖片使用算法來實現它:

enter image description here

我的實現:

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

SMO的標記線之間的事適用於SQL Server管理對象。我不認爲這適用於你的問題。我刪除了它,併爲MatLab添加了一個標籤。 –

回答

1

一個很大的錯誤是

A = F( x)服從g(x)

並不意味着「如果g(x)那麼a = f(x)」,而是「僅考慮這樣的x就是g(x)爲真」的a = f(x)。

所以

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

(以及未來如果)不是操作的有效實施

i = arg max SOMETHING subject to CONSTRAINTS 

你應該做的

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