for(i in 1:max){
v<-w%*%p;
y<-v;
e<-d-y;
eps[i 1]<-sum(e^2)/length(e)
w<-w a*(d-y)%*%t(p);
if(i==max)
print(w)
}
得到分类直线:
相比感知器分类而言已经好了太多了,究其原因不外乎传递函数由二值阈值函数变为了线性函数,这也就是我们前面提到的delta法则会收敛到目标概念的最佳近似。增量法则渐近收敛到最小误差假设,可能需要无限的时间,但无论训练样例是否线性可分都会收敛。
为了明了这一点我们考虑鸢尾花数据后两类花的分类(这里我们将前两类看做一类),使用感知器:
使用线性分类器:
但是要解释的一点是,收敛并不意味着分类效果更好,要解决线性不可分问题需要的是添加非线性输入或者增加神经元。我们以Minsky & Papert (1969)提出的异或例子为例说明这一点。
使用线性神经网络,代码与上面完全相同,略。
第一个神经元输出:
权值: [,1] [,2] [,3]
[1,] 0.75 0.5 -0.5
测试: [,1] [,2] [,3] [,4]
[1,] 1 0 1 1
第二个神经元输出:
权值: [,1] [,2] [,3]
[1,] 0.75 -0.5 0.5
测试: [,1] [,2] [,3] [,4]
[1,] 1 1 0 1
求解异或逻辑(相同取0,不同取1)有结果:(代码xor(c(1,0,1,1),c(1,1,0,1)))
[1] FALSE TRUE TRUE FALSE
即0,1,1,0,分类正确。
最后再说一点,Delta规则只能训练单层网络,但这不会对其功能造成很大的影响。从理论上说,多层神经网络并不比单层神经网络更强大,他们具有同样的能力。
三、BP神经网络
1、sigmoid函数分类
回顾我们前面提到的感知器,它使用示性函数作为分类的办法。然而示性函数作为分类器它的跳点让人觉得很难处理,幸好sigmoid函数y=1/(1 e^-x)有类似的性质,且有着光滑性这一优良性质。我们通过下图可以看见sigmoid函数的图像:
Sigmoid函数有着计算代价不高,易于理解与实现的优点但也有着欠拟合,分类精度不高的特性,我们在支持向量机一章中就可以看到sigmoid函数差劲的分类结果。
2、BP神经网络结构
BP (Back Propagation)神经网络,即误差反传误差反向传播算法的学习过程,由信息的正向传播和误差的反向传播两个过程组成。由下图可知,BP神经网络是一个三层的网络:
输入层(input layer):输入层各神经元负责接收来自外界的输入信息,并传递给中间层各神经元;
隐藏层(Hidden Layer):中间层是内部信息处理层,负责信息变换,根据信息变化能力的需求,中间层可以设计为单隐层或者多隐层结构;最后一个隐层传递到输出层各神经元的信息,经进一步处理后,完成一次学习的正向传播处理过程;
输出层(Output Layer):顾名思义,输出层向外界输出信息处理结果;
当实际输出与期望输出不符时,进入误差的反向传播阶段。误差通过输出层,按误差梯度下降的方式修正各层权值,向隐藏层、输入层逐层反传。周而复始的信息正向传播和误差反向传播过程,是各层权值不断调整的过程,也是神经网络学习训练的过程,此过程一直进行到网络输出的误差减少到可以接受的程度,或者预先设定的学习次数为止。
3、反向传播算法
反向传播这一算法把我们前面提到的delta规则的分析扩展到了带有隐藏节点的神经网络。为了理解这个问题,设想Bob给Alice讲了一个故事,然后Alice又讲给了Ted,Ted检查了这个事实,发现这个故事是错误的。现在 Ted 需要找出哪些错误是Bob造成的而哪些又归咎于Alice。r语言 支持向量机分类当输出节点从隐藏节点获得输入,网络发现出现了误差,权系数的调整需要一个算法来找出整个误差是由多少不同的节点造成的,网络需要问,“是谁让我误入歧途?到怎样的程度?如何弥补?”这时,网络该怎么做呢?
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-32507-3.html
俺们那的人大部分谈生意都很实诚