资源简介

中国科学院大学 电子学院 机器学习与应用 作业 序列优化算法改写

资源截图

代码片段和文件信息

% my_seqminopt
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %请使用自己设计的SMO算法替代原Matlab的SMO算法
%     [alpha bias] = seqminopt(training groupIndex ...
%         boxconstraint tmp_kfun smo_opts);
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
function [alpha bias] = my_seqminopt(training_data Labels boxconstraint kernel_func smo_opts)

N = length(training_data);%计算样本数量
alpha = zeros(N1);%初始话所有的拉格朗日橙子
bias = 0.0;%初始化偏移量

num_changed = 0;%拉格朗日橙子改变的个数
exam_all = 1;%是否检查全部乘子

while num_changed >0 || exam_all
     num_changed = 0;
     if exam_all==1
          for i=1:N 
               num_changed = num_changed + examineExample(i);
          end
     else
          for i = 1:N
               if (alpha(i) ~= 0 && alpha(i)~= boxconstraint(i))
                    num_changed = num_changed+examineExample(i);
               end 
          end
     end
     
     if exam_all == 1
          exam_all =0;
     elseif num_changed == 0 %当乘子全部检查完后,标志位置1
          exam_all = 1;
     end  
     
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 检查样本。
    % 首先判断i2是否满足KKT条件,如果不满足,则根据启发式规则再选择i1样本,
    % 然后更新i1和i2的拉格朗日乘子。
    function [flag] = examineExample(i2)
        y2 =  Labels(i2);
        alpha2 = alpha(i2);
        E2 = wxpb(i2) - y2;
        r2 = E2 * y2;
        if (r2 < -smo_opts.TolKKT && alpha2 < (i2)) || (r2 > smo_opts.TolKKT && alpha2 > 0)
            i1 = selectSecondChoice(i2 E2);
            if i1 == -1
                i1 = floor(1 + rand() * N); % 随机选一个i1
                while i1 == i2
                    i1 = floor(1 + rand() * N);
                end
                flag = takeStep(i1i2);
            else
                flag = takeStep(i1i2);
            end
        else
            flag = 0;
        end
    end


 % 计算当前参数下第idx个样本的函数输出
    function [svm_o] = wxpb(idx)
        svm_o = 0.0;
        for j = 1 : N
            svm_o = svm_o + alpha(j) * Labels(j) * kernel_func(training_data(j:)training_data(idx:));
        end
        svm_o = svm_o + bias;
    end

    % 选定第二个变量i2后,根据max|E1-E2|的启发式规则,选择i1;
    % 如果没有满足条件的i1,返回-1.
    function [i1] = selectSecondChoice(i2 E2)
        i1 = -1;
        maxDelta = -1;
        for j = 1 : N
            if j ~= i2 && alpha(j) ~= 0 && alpha(j) ~= boxconstraint(j)
                Ej = wxpb(j) - Labels(j);
                if abs(E2 - Ej) > maxDelta
                    i1 = j;
                    maxDelta = abs(E2 - Ej);
                end
            end
        end
    end

    % 根据选定的两个变量i1i2,代入更新公式计算;
    % 最后还更新了偏移量offset,也就是y=wx+b中的b。
    function [flag] = takeStep(i1 i2)
        alpha1 = alpha(i1);
        y1 =  Labels(i1);
        E1 = wxpb(i1) - y1;
        alpha2 = alpha(i2);
        y2 =  Labels(i2);
        E2 = wxpb(i2) - y2;
        s = y1 * y2;
        if y1 ~= y2
            L = max(0 alpha2 - alpha1);
        

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        4654  2018-05-07 09:19  my_seqminopt.m
     文件         825  2018-05-01 10:39  my_svm.m
     文件       10425  2018-05-01 16:29  my_svmtrain.m

评论

共有 条评论