MATLAB实现智能计算方法课程所有实验代码资源链接为:MATLAB实现智能计算方法课程所有实验代码资源
MATLAB实现智能计算方法课程所有实验汇总博客链接为:MATLAB实现智能计算方法实验汇总
利用BP神经网络,解决性别分类问题:
原始数据student.xls,部分数据放入报告中即可;
以身高、体重为输入,性别为输出,设计网络结构(以图的形式放入报告);
手工编码(python或MATLAB),实现对性别的分类计算,并用测试数据验证模型的正确性。
用MATLAB工具箱编程实现模型仿真并用测试数据对性别进行预测。
测试数据1:身高(162cm),体重(56kg),性别(女)。
测试数据2:身高(172cm),体重(75kg),性别(男)。
将原始数据进行处理,性别为“男”设为1,为“女”设为0,应用“=IF(Bi=“男”,1,0)”公式在excel中完成数据预处理的操作,处理后部分数据如下表。
编号 | 性别 | 身高 | 体重 | 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个神经单元,输出层有1个神经单元的神经网络,网络结构如下图2.1。
根据神经网络的算法原理在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 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);
执行程序得到最大均方误差曲线如图3.1,预测结果分布如图3.2。
通过图3.1可知共经过了2000次迭代,最终的最大均方误差为0.08左右。通过此网络验证测试样本,得到的结果为0.0096和0.9882,可以判定第一个样本性别为“女”,第二个为“男”,与样本所给结果一致。
应用MATLAB工具箱编程实现模型仿真并用测试数据对性别进行预测,程序代码如下:
clear;
clc;
data = xlsread('student.xlsx');
P = data(:, 3 : 4);
T = data(:, 5);
%premnmx(P', T')对P',T'进行归一化处理
[pn, minp, maxp, tn, mint, maxt] = premnmx(P', T');
p1 = pn(:, 1: 260);
t1 = tn(:, 1: 260);
%反归一化还原成原始的数据
pn1 = postmnmx(p1, minp, maxp);
tn1 = postmnmx(t1, mint, maxt);
p = [162 172; 56 75];
t = [0 1];
[p2, minp1, maxp1, t2, mint1, maxt1] = premnmx(p, t);
pn2 = postmnmx(p2, minp1, maxp1);
tn2 = postmnmx(t2, mint1, maxt1);
net=newff(minmax(p1),[2,1],{'tansig','purelin'},'trainrp');
net.trainParam.epochs=2000;
net.trainParam.goal=0.00001;
net.trainparam.lr=0.01;
net=train(net,p1,t1);
%调用matlab神经网络工具箱自带的sim函数得到网络的预测值
y1=sim(net,p1);
tfz=postmnmx(y1,mint,maxt);
tfz1=tfz';
%disp展示变量内容
disp(tfz);
disp(tn1);
temp1=sim(net,p2);
t_tfz=postmnmx(temp1,mint,maxt);
txl1=t_tfz';
disp(t_tfz);
disp(tn2);
y_t1=temp1(1,:);
%计算相对逼近误差
error1=y1-t1(1,:);
%计算相对预测误差
error3=y_t1-t2(1,:);
figure;
%绘制预测误差曲线
plot(1:260,error1,'r');
title("相对逼近误差");
figure;
plot(1:2,error3,'b');
title("相对预测误差");
执行程序,训练样本相对误差如图4.1,测试样本相对误差如图4.2,误差曲线如图4.3。
观察图4.3,可知迭代次数为2000,最大均方误差为0.28799,代入测试样本得到的结果为-0.0236和0.9995,判定第一个样本性别为“女”,第二个为“男”,与样本所给结果一致。