python实现人工神经网络BP算法(数据挖掘算法系列之五)

By | 2016-12-18

关于BP神经网络

wiki:误差向后传播(BP)神经网络

python实现

定义激活函数:Sigmoid函数

定义BP网络的能量函数(误差函数)

下面定义BP神经网络类

初始化BP神经网络

在第一阶段,神经网络各节点的连接权值固定不变,网络的计算从输入层开始,逐层逐个节点地计算每一个节点的输出。

在第二阶段,即学习阶段,各节点的输出保持不变,网络学习从输出层开始,反向逐层逐个节点地计算各连接权值的修改量,以修改各连接权值,直到输入层为止。

定义训练函数,通过调用向前、向后传播函数,不断进行正向传播和反向传播计算过程,直到得到训练次数或者达到误差要求。

为了有一个更直观的效果显示,把结果通过作图展示出来。

主函数

效果展示

这里博主定义的网络结构为1-10-1,学习速率为0.5,学习次数上限分别取1000,10000,100000来测试效果

学习次数为1000时,效果如下

np1000

学习次数为10000时,效果如下

np10000

学习次数为100000时,效果如下

np100000

从最终结果可以发现,函数逼近在折点处的效果不是很好,但总体上还是不错的。

部分函数没有展示出来,需要的可以参考完整代码,欢迎讨论学习。

3 thoughts on “python实现人工神经网络BP算法(数据挖掘算法系列之五)

  1. czfshine

    感觉你把python当作c++了,代码有点长。
    比如,可以把creatMatrix的第三个参数写成lambda,然后就可以省略掉初始化权值的那几行了=。=

    def creatMatrix(n, m, fill = lambda : 0.0):
    mat = []
    for i in range(n):
    mat.append([fill() for x in range(m) ])
    return mat
    def rand(a, b):
    return random.uniform(a, b)
    print(creatMatrix(2,2,lambda : rand(0.1,0.5)))

    然后“激活隐含层” “激活输出层”这些其实就是矩阵乘法= =,假设输入为X,输出为Y,隐藏层是L,两个权值分别为W_1,W_2,那么激活过程就是
    L=sigmoid(dot(X,W_1));
    Y=sigmoid(dot(L,W_2));
    反向回来也一样。

    而且有很多层的话直接弄个循环就美滋滋了。

    Reply
    1. clogos Post author

      多谢指教!
      代码写得确实不够优美,对python也不够熟悉。

      Reply
  2. czfshine

    在左边转角处拟合不好应该和激活函数的选取有关,换用relu或者其他的函数试试。右边的拐点没法拟合只能归咎于这个模型学习能力弱了╮(﹀_﹀)╭

    Reply

发表评论

电子邮件地址不会被公开。