2016-11-07 64 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))