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

1. 数据预处理

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

编号

性别

身高

体重

output

1


174.2

91.9

1

2


156

57.6

0

3


151.7

59.9

0

4


181.5

107.2

1

5


169.1

55.6

1

6


175.6

90.6

1

7


174.3

73

1

8


175.4

67.9

1

2. 设计网络结构

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

MATLAB手工实现BP神经网络_matlab

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。

MATLAB手工实现BP神经网络_神经网络_02


MATLAB手工实现BP神经网络_matlab_03


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