BP算法的实现_MATLAB学习笔记2

本文是对学些B站东方耀老师教程bp算法的一个笔记。曲线救国第一步,先学算法对应的python编程,再将python程序改写为matlab程序。

BP算法,back propagation algorithm,全称是误差反向传播函数,就是在进行正向传播后计算出误差和预测值,再根据预测值和实际值的差距不断去调整网络中每一条链路的权重,从而使预测值不断接近实际值。但这种算法有一个缺点就是容易过拟合。
本文基于BP算法的神经网络如下图所示,输入层神经元个数为2个,输出层神经元个数为2个,中间隐藏层的神经元个数为3个;激活函数使用sigmoid函数;误差函数采用误差均方函数;用梯度下降的方法更新权重,学习率为0.5。

在这里插入图片描述
其详细的推导过程可见东方耀老师的视频,里面有很详尽的推导过程,这里不再赘述。

跟着视频打出来的python程序如下:

import numpy as np

w = [0, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65]
b = [0, 0.35, 0.65]
l = [0, 5, 10]
s = 0.5  # 学习率


def sigmoid(z):
    return 1.0/(1+np.exp(-z))


# print(sigmoid(0))


def bp(w, b, l):
    # fp 前向传播,计算预测值与误差
    h1 = sigmoid(w[1] * l[1] + w[2] * l[2] + b[1])
    h2 = sigmoid(w[3] * l[1] + w[4] * l[2] + b[1])
    h3 = sigmoid(w[5] * l[1] + w[6] * l[2] + b[1])
    o1 = sigmoid(h1 * w[7] + h2 * w[9] + h3 * w[11]+b[2])
    o2 = sigmoid(h1 * w[8] + h2 * w[10] + h3 * w[12]+b[2])
    e = 1/2.0 * np.square(0.01 - o1)+1/2.0 * np.square(0.99 - o2)

    # bp 后向传播,更新各个权重
    t1 = -(0.01 - o1) * o1 * (1 - o1)
    t2 = -(0.99 - o2) * o2 * (1 - o2)
    w[7] = w[7] - s * (t1 * h1)
    w[9] = w[9] - s * (t1 * h2)
    w[11] = w[11] - s * (t1 * h3)

    w[8] = w[8] - s * (t2 * h1)
    w[10] = w[10] - s * (t2 * h2)
    w[12] = w[12] - s * (t2 * h3)

    w[1] = w[1] - s * (t1 * w[7] + t2 * w[8]) * h1 * (1 - h1) * l[1]
    w[2] = w[2] - s * (t1 * w[7] + t2 * w[8]) * h1 * (1 - h1) * l[2]
    w[3] = w[3] - s * (t1 * w[9] + t2 * w[10]) * h2 * (1 - h2) * l[1]
    w[4] = w[4] - s * (t1 * w[9] + t2 * w[10]) * h2 * (1 - h2) * l[2]
    w[5] = w[5] - s * (t1 * w[11] + t2 * w[12]) * h3 * (1 - h3) * l[1]
    w[6] = w[6] - s * (t1 * w[11] + t2 * w[12]) * h3 * (1 - h3) * l[2]

    return o1, o2, w, e


for i in range(1001):
    o1, o2, w, e = bp(w, b, l)
    print('第{}次迭代:预测值为:({},{}),总误差:{},权重系数{}'.format(i, o1, o2, e, w))

把python程序改写为matlab程序如下:

clc;

sym o1;
sym o2;
sym s;

w= {0, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65};
b= {0, 0.35, 0.65};
l= {0, 5, 10};


for i=1:8000    %迭代8000[o1,o2,w]=backpropagation(w,b,l);
    fprintf("第%d次:\r\n预测值:%f,%f\r\n%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\r\n", ...
       i,o1,o2,w{2},w{3},w{4},w{5},w{6},w{7},w{8},w{9},w{10},w{11},w{12},w{13})
end

function [y]=sigmoid(x) %定义sigmoid激活函数
y=1.0/(1+exp(-x));
end

function[o1,o2,w]=backpropagation(w,b,l)  %定义bp函数

    s=0.5; % 学习率
   % fp 前向传播,计算预测值与误差
    h1 = sigmoid(w{1} * l{1} + w{2} * l{2} + b{1});
    h2 = sigmoid(w{3} * l{1} + w{4} * l{2} + b{1});
    h3 = sigmoid(w{5}* l{1} + w{6} * l{2} + b{1});
    o1 = sigmoid(h1 * w{7} + h2 * w{9} + h3 * w{11}+b{2});
    o2 = sigmoid(h1 * w{8} + h2 * w{10} + h3 * w{12}+b{2});
    e = 1/2.0 * (0.01 - o1)^2+1/2.0 * (0.99 - o2)^2;

    % bp 后向传播,更新各个权重
    t1 = -(0.01 - o1) * o1 * (1 - o1);
    t2 = -(0.99 - o2) * o2 * (1 - o2);
    w{7} = w{7} - s * (t1 * h1);
    w{9} = w{9} - s * (t1 * h2);
    w{11} = w{11} - s * (t1 * h3);

    w{8} = w{8} - s * (t2 * h1);
    w{10} = w{10} - s * (t2 * h2);
    w{12} = w{12} - s * (t2 * h3);

    w{1} = w{1} - s * (t1 * w{7} + t2 * w{8}) * h1 * (1 - h1) * l{1};
    w{2} = w{2} - s * (t1 * w{7} + t2 * w{8}) * h1 * (1 - h1) * l{2};
    w{3} = w{3} - s * (t1 * w{9} + t2 * w{10}) * h2 * (1 - h2) * l{1};
    w{4} = w{4} - s * (t1 * w{9} + t2 * w{10}) * h2 * (1 - h2) * l{2};
    w{5} = w{5} - s * (t1 * w{11} + t2 * w{12}) * h3 * (1 - h3) * l{1};
    w{6} = w{6} - s * (t1 * w{11} + t2 * w{12}) * h3 * (1 - h3) * l{2};

end

迭代了8000次后的结果:
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值