对sigmoid分类器进行了进一步实验以帮助自己进行更深的理解,
在A中一共有9个特征,其中只有最后一组具有分类价值(以0为界)
进行了足够多的迭代后,发现依然得到了理想的分类结果。
o =
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000
theta =
-1.9421 -1.7052 3.2767 -4.6341 8.1949 7.2902 6.1837 -2.0975 40.8495
由最后参数的结果可以看出,最后一个属性对应的参数明显比其它参数要大,考虑到学习率alpha的制约,当迭代次数不足时应该会影响结果:
迭代20次
o =
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 0.0000 1.0000(错误3个)
迭代50次
o =
0.0000 0 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 1.0000 1.0000 1.0000 0.0000 1.0000(错误1个)
迭代100次
o =
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000
theta =
-1.9424 -1.7337 3.2740 -4.6344 8.1924 7.2881 6.1835 -2.0987 40.8493
theta已经接近了最终值。
结论:sigmoid分类器具有比较好的抗干扰性,这也可以解释为什么用sigmoid单元组建起来的人工神经网络有如此好的健壮性。
令人惊奇的是,使用随机梯度上升算法却没有得到更快的收敛速度,
当使用同样的迭代次数时(100次)随机梯度上升算法仍然出现了错误。
o =
0.0000 1.0000 0.0000 1.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000
迭代200次时才得到了预期效果:
o =
0.0000 0.0000 0.0000 0.0001 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 0.9995 1.0000
下次再试试牛顿方法可以得到什么样的结果。
3 4 5 6 1 15 16 120 17 18 118 10 11 13;
118 120 13 15 85 2 3 18 4 5 6 19 1 8;
12 13 14 1 2 3 4 8 9 10 11 5 6 7;
5 6 7 12 13 14 1 2 3 4 8 9 10 11;
5 6 7 12 1 2 3 4 13 14 8 9 10 11;
12 8 9 13 4 5 14 1 2 3 6 10 11 7;
-4 -2 9 1 -5 -1 3 5 -8 -9 -12 11 2 4;
-8 -2 -5 -1 9 1 -4 3 5 11 2 -9 -12 4;
-4 -2 -5 -1 -8 -9 -12 9 1 3 5 11 2 4
]
Y = [0 0 0 0 0 0 0 1 1 1 1 1 1 1];
theta = [0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1];
b = 0.1;
alpha = 0.05
rand('seed',10)
for i = 1:size(A) - 1
index = randperm(length(A))%打乱顺序
for j = 1:length(A)
x = A(i,index(j))
A(i,index(j)) = A(i,j)
A(i,j) = x
end
end
for j = 1:1:200
sum = [0]
sumb = 0
for k = 1:1:length(A)
sum(k) = 0
end
if(0)%梯度上升
for i = 1:1:length(A)
exp_list = b
for k = 1:1:size(A)
exp_list = exp_list + theta(k) * A(k,i)
end
for k = 1:1:size(A)
sum(k) = sum(k) + (Y(i) - 1 / (1 + exp(- exp_list))) * A(k,i);
end
sumb = sumb + (Y(i) - 1 / (1 + exp(- exp_list)));
end
end%注释
if(1)%随机梯度上升
for i = 1:1:length(A)
exp_list = b
for k = 1:1:size(A)
exp_list = exp_list + theta(k) * A(k,i)
end
for k = 1:1:size(A)
sum(k) = (Y(i) - 1 / (1 + exp(- exp_list))) * A(k,i)
end
for k = 1:1:size(A)
theta(k) = theta(k) + alpha * sum(k) %随机梯度上升
end
sumb = Y(i) - 1 / (1 + exp(- exp_list))
b = b + alpha * sumb;
end
end
for k = 1:1:size(A)
sum(k) = (Y(i) - 1 / (1 + exp(- exp_list))) * A(k,i)
end
b = b + alpha * sumb;
display(theta)
end
o = [0]
for i = 1:1:length(A)
exp_list = b
for k = 1:1:size(A)
exp_list = exp_list + theta(k) * A(k,i)
end
o(i) = 1 / (1 + exp(- exp_list))
end
display(o);