斜决策树 OC1算法 matlab实现

一、结点划分平面的设计
oc1算法是一种贪婪算法,先贪心的选择每个属性的最优权值,在加入随机扰动试图找到更好的边界。
寻找属性最优权值的算法如下:
《斜决策树 OC1算法 matlab实现》
加入随机扰动,产生随机边界进行搜索算法:
《斜决策树 OC1算法 matlab实现》
二、matlab实验

%寻找最优轴平行划分超平面
melondata = [0.697	0.46	1
0.774	0.376	1
0.634	0.264	1
0.608	0.318	1
0.556	0.215	1
0.403	0.237	1
0.481	0.149	1
0.437	0.211	1
0.666	0.091	0
0.23	0.267	0
0.245	0.057	0
0.343	0.099	0
0.639	0.161	0
0.657	0.198	0
0.36	0.37	0
0.593	0.042	0
0.719	0.103	0];

%划分属性和标签
x_axis = melondata(:,1);
y_axis = melondata(:,2);
label_axis = melondata(:,3);
%样本数量
count = length(label_axis);

a_coemax = [0, 1, -0.2045];
%扰动a1
%计算Vj
d_data = [melondata(:,1:2), ones(count, 1)]';

for m = 1 : 500
for i = 1 : 3
    v_j = (a_coemax * d_data);
    u_j = (a_coemax(i) * d_data(i,:) - v_j) ./ d_data(i,:);

    u_sort = sort(u_j);
    u_divide = (u_sort(2:count) + u_sort(1:count-1)) / 2;

    a_coe = a_coemax;

    %计算TwoingValue
     tv = zeros(count-1, 2);
     tvmax = 0;
    for j = 1 : count-1
        a_coe(i) = u_divide(j);
        %统计计算TwoingValue值所需要的参数
        tl = 0; tr = 0; lk = zeros(2,1); rk = zeros(2,1);
        for k = 1 : count
            p_coe = [x_axis(k), y_axis(k), 1]';
            v_i = a_coe * p_coe;
            if v_i < 0
                tl = tl + 1;
                if label_axis(k) == 0
                    lk(1) = lk(1) + 1;
                else
                    lk(2) = lk(2) + 1;
                end
            else
                tr = tr + 1;
                if label_axis(k) == 0
                    rk(1) = rk(1) + 1;
                else
                    rk(2) = rk(2) + 1;
                end
            end
        end
        tv(j,i) = tl / count * tr / count * (abs(lk(1) / tl - rk(1) / tr) + abs(lk(2) / tl - rk(2) / tr))^2;
        if tv(j,i) > tvmax
            tvmax = tv(j,i);
            a_coemax = a_coe;
        end
    end
end
end

斜划分边界如下:
《斜决策树 OC1算法 matlab实现》
对结点划分平面划分出的两个子集,若子集中全为同一属性样本,则作为叶子;若子集中不为同一属性样本,则作为叶结点,对此叶结点做下一步的划分。
三、总结
斜决策树是归纳一颗以线性分类器作为划分平面的决策树,是多个属性的线性组合,不再是对单一属性的划分。划分平面的选择是一个NP难问题,很难精确找到问题的最优解,可以通过OC1算法,CART-LC算法寻找,也可以通过遗传算法等启发式算法寻找。OC1算法是以爬山算法为基础,加入随机扰动试图跳出局部最优的一种算法,在构造分类边界上有很好的效果。作者证明算法最差的时间复杂度为O(N2logN)。

点赞