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