【MATLAB第56期】#源码分享 | 基于MATLAB的机器学习算法单输入多输出分类预测模型思路(回归改分类)
针对单输入多输出分类预测,可采用回归的方式进行预测。
本文采用BP神经网络进行演示。
一、导入数据
数据为1输入,5输出,总共482个样本。
输出分为五个指标,每个指标共4个评分维度,即【0 10 20 30】
bash
%% 导入数据
load data
二、数据样本划分
保持样本均匀多样性,可将数据打乱。
bash
temp = randperm(size(data,1));%打乱数据顺序
若不需要打乱,上面代码改成:
bash
temp = 1:size(data,1):;%不打乱数据
训练样本数量可自行设置 ,本文设置为422。
代码如下:
bash
%% 划分训练集和测试集
temp = randperm(size(data,1));%打乱数据顺序
NN=422;%训练数量
P_train = data(temp(1: NN), 6 )';%422个数据为训练,剩余为测试,第6列y为输入
T_train = data(temp(1: NN), 1: 5)';%x为输出
M = size(P_train, 2);
P_test = data(temp(NN+1: end), 6 )';
T_test = data(temp(NN+1: end), 1: 5)';
N = size(P_test, 2);
三、归一化设置
常用归一化有两种,即最大最小值归一化及标准值归一化。
bash
method=@mapminmax;%最大最小值归一化
method=@mapstd;%标准值归一化
归一化区间可自行设置,默认[-1,1],本文采用[0,1]
bash
%% 数据归一化
method=@mapstd;
[p_train, ps_input] = method(P_train, 0, 1);
p_test = method('apply', P_test, ps_input);
[t_train, ps_output] = method(T_train, 0, 1);
t_test = method('apply', T_test, ps_output);
四、模型创建及预测
熟悉的BP网络建模过程,不多介绍。
若涉及多隐含层,可修改[20,20,5]中的数字。前2个20代表两层隐含层的神经元数 ,后面的5为输出节点,根据本案例数据设置。
若增加或者减少隐含层,需要更改后面对应的激活函数。
bash
net = newff(minmax(p_train), [20,20,5],{'logsig','logsig','purelin'});
代码如下:
bash
%% 创建网络
%net = newff(minmax(p_train), t_train, 10);
net = newff(minmax(p_train), [20,20,5],{'logsig','logsig','purelin'});
%% 设置训练参数
net.trainParam.epochs = 2000; % 迭代次数
net.trainParam.goal = 1e-7; % 误差阈值
net.trainParam.lr = 0.01; % 学习率
net.trainFcn = 'trainlm';
%% 训练网络
net = train(net, p_train, t_train);
%% 仿真测试
t_sim1 = sim(net, p_train);
t_sim2 = sim(net, p_test );
%% 数据反归一化
T_sim1 = method('reverse', t_sim1, ps_output);
T_sim2 = method('reverse', t_sim2, ps_output);
五、分类预测结果
因上一步骤进行了正常的回归预测,输出一般为小数点,且不是限定标签的数值。所以需要通过find函数,将回归预测的输出结果进行分段赋值。
根据四舍五入的思路,如数据如果在5以下,则赋值为0,
如果为[5,15),赋值为10...
依次进行赋值。
bash
for i = 1: 5
[m1,n1]=find(T_sim(i,:)<5);T_sim1(i,n1)=0;
[m2,n2]=find(T_sim(i,:)<15 & T_sim1(i,:)>=5);T_sim1(i,n2)=10;
end
六、评价指标及绘图
bash
%% 绘图
figure
subplot(2, 1, 1)
plot(1: M, T_train(i, :), 'r-*', 1: M, T_sim1(i, :), 'b-o', 'LineWidth', 1)
legend(['x' num2str(i) '真实值'],['x' num2str(i) '预测值'])
xlabel('预测样本')
ylabel('预测结果')
string = {'训练集预测结果对比'; ['准确率acc=' num2str(acc1(i, :))]};
title(string)
xlim([1, M])
grid
subplot(2, 1, 2)
plot(1: N, T_test(i, :), 'r-*', 1: N, T_sim2(i, :), 'b-o', 'LineWidth', 1)
legend(['x' num2str(i) '真实值'],['x' num2str(i) '预测值'])
xlabel('预测样本')
ylabel('预测结果')
string = {'测试集预测结果对比';['准确率acc=' num2str(acc2(i, :))]};
title(string)
xlim([1, N])
grid
%% 分割线
disp('**************************')
disp(['下列是输出', num2str(i)])
disp('**************************')
end
七、测试新数据
若输入为一个新值,则预测结果参考下列代码:
bash
%% 测试新数据
p_newtest=21.6;% 输入新数据
p_newtest1 = method('apply',p_newtest, ps_input);
t_simnew = sim(net, p_newtest1);
T_simnew = method('reverse', t_simnew , ps_output);
T_simnew
八、代码获取
后台私信回复"56期",可获取下载链接。