MATLAB手工实现BP神经网络

掌握BP算法的手工计算,用MATLAB工具箱编程实现模型仿真并用测试数据对性别进行预测。
测试数据1:身高(162cm),体重(56kg),性别(女)。
测试数据2:身高(172cm),体重(75kg),性别(男)。

1. 数据预处理

将原始数据进行处理,性别为“男”设为1,为“女”设为0,应用“=IF(Bi=“男”,1,0)”公式在excel中完成数据预处理的操作,处理后部分数据如下表1。

编号性别身高体重output
1174.291.91
215657.60
3151.759.90
4181.5107.21
5169.155.61
6175.690.61
7174.3731
8175.467.91

2. 设计网络结构

设计具有一层隐含层,隐含层为2个神经单元,输入层有2个神经单元,输出层有1个神经单元的神经网络,网络结构如下图1。

图1 神经网络结构

3. 手工编码

根据神经网络的算法原理在matlab中编写性别分类原理的手工代码,其中初始权值设置为(-2.4/F, 2.4/F)之间的随机数,F为所连单元的输入端个数,初始阈值设置为(-0.5, 0.5)间的随机数,学习率设置为0.01,期望误差设置为10-3,迭代次数设置为2000,最后通过测试样本进行模型的检验,具体代码如下:

clear;
clc;

%训练模块
data = xlsread('student.xlsx');
P0 = data(:, 3 : 4);
T = data(:, 5);
[pn, minp, maxp] = premnmx(P0');
P = pn';
col = size(P, 1);
w = -1.2 + 2.4*rand(1, 6);
[miu, v, E] = deal(zeros(1, 3));
b = -0.5 + rand(1, 3);
yita = 0.01;
goal = 0.001;
error = [];
for epochs = 1: 2000
    s = [];
    for k = 1: col
        miu(1) = P(k, 1)*w(1) + P(k, 2)*w(2) + b(1);
        v(1) = 1/(1 + exp(-miu(1)));
        miu(2) = P(k, 1)*w(3) + P(k, 2)*w(4) + b(2);
        v(2) = 1/(1 + exp(-miu(2)));
        miu(3) = v(1)*w(5) + v(2)*w(6) + b(3);
        v(3) = 1/(1 + exp(-miu(3)));
        E(3) = v(3)*(1 - v(3))*(T(k) - v(3));
        E(2) = v(2)*(1 - v(2))*E(3)*w(6);
        E(1) = v(1)*(1 - v(1))*E(3)*w(5);
        w(6) = w(6) + yita*E(3)*v(2);
        w(5) = w(5) + yita*E(3)*v(1);
        for m = 1: 4
            w(m) = w(m) + yita*E(ceil(m/2))*P(k, 2-rem(m,2));
        end
        b = b + yita*E;
        s = [s, v(3)];
    end
    error0 = mse(s - T');
    if error0 <goal
        break
    else
        error = [error error0];
    end
end
figure;
%绘制迭代结束时预测结果分布图
for n = 1: size(s, 2)  
    if s(n)>0.5
        plot(n, s(n), '+');
        hold on;
    else
        plot(n, s(n), 'o');
        hold on;
    end
end
%绘制最大均方误差曲线图
figure;
plot(1:size(error, 2), error);

%测试模块
output = [];
testp0 = [162 56; 172 75];
[testpn] = premnmx(testp0', 1);
testp = testpn';
for testk = 1: 2
    miu(1) = testp(testk, 1)*w(1) + testp(testk, 2)*w(2) + b(1);
    v(1) = 1/(1 + exp(-miu(1)));
    miu(2) = testp(testk, 1)*w(3) + testp(testk, 2)*w(4) + b(2);
    v(2) = 1/(1 + exp(-miu(2)));
    miu(3) = v(1)*w(5) + v(2)*w(6) + b(3);
    v(3) = 1/(1 + exp(-miu(3)));
    output = [output, v(3)];
end
disp("预测结果为:");
disp(output);

执行程序得到最大均方误差曲线如图2,预测结果分布如图3。
图2 最大均方误差曲线
图3 预测结果分布
通过图2可知共经过了2000次迭代,最终的最大均方误差为0.08左右。通过此网络验证测试样本,得到的结果为0.0096和0.9882,可以判定第一个样本性别为“女”,第二个为“男”,与样本所给结果一致。

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lazyn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值