前言
一、主函数
二、其它函数
预测结果
首先需要安装一下遗传算法工具箱,可参考这篇博客
MATLAB遗传算法工具箱安装包及安装方法(图解)_周杰伦今天喝奶茶了吗的博客-CSDN博客_matlab遗传算法工具箱安装
本模型可以结合自己的数据集进行预测,需要自行修改的地方均会使用【】进行标注。
main.m
%% 加载神经网络的训练样本 测试样本每行一个样本 每列一个特征 输入P 输出T
load input.mat % 【需要修改】导入输入数据集
load output.mat %【需要修改】导入输出数据集
P_train=input(1:75,1:5); %【需要修改】第1-75行作为训练数据,输入数据集第1-5列是输入的特征
T_train=output(1:75,1); %【需要修改】第1-75行作为训练数据,输出数据集第1列作为最终预测的特征
P_test=input(76:100,1:5); %【需要修改】第76-100行作为测试数据,输入数据集第1-5列是输入的特征
T_test=output(76:100,1); %【需要修改】第76-100行作为测试数据,输出数据集第1列作为最终预测的特征
%% 获取输入层节点、输出层节点个数
% 初始隐层神经元个数
inputnum=size(P_train,2);
hiddennum=2*inputnum+1;
outputnum=size(T_train,2);
w1num=inputnum*hiddennum; % 输入层到隐层的权值个数
w2num=outputnum*hiddennum;% 隐层到输出层的权值个数
N=w1num+hiddennum+w2num+outputnum; %待优化的变量的个数
%% 定义遗传算法参数
NIND=50; %个体数目
MAXGEN=50; %最大遗传代数
PRECI=10; %变量的二进制位数
GGAP=0.93; %代沟
px=0.84; %交叉概率
pm=0.02; %变异概率
trace=zeros(N+1,MAXGEN);%寻优结果的初始值(初始化操作)
FieldD=[repmat(PRECI,1,N);repmat([-0.5;0.5],1,N);repmat([1;0;1;1],1,N)];%区域描述器,这一项主要是用来控制个体由2进制变成10进制的规则(个人理解就是数据由2进制转化为10进制并对样本进行归一化的过程)
Chrom=crtbp(NIND,PRECI*N);%初始种群 这里会生成一个40 x(10*N)的矩阵,即每一个种群中都包含了N个2进制的数用来表示N个个体
%% 优化
gen=0; %代计数器
X=bs2rv(Chrom,FieldD); %计算初始种群的十进制转换(根据上述规则将X的2进制转化为10进制)
ObjV=Objfun(X,P_train,T_train,hiddennum,P_test,T_test); %计算目标函数值(将X带入适应度函数进行判断)
while gen
1、Objfun.m
function Obj=Objfun(X,P_train,T_train,hiddennum,P_test,T_test)
%% 用来分别求解种群中各个个体的目标值
%% 输入
% X:所有个体的初始权值和阈值
% P_train:训练样本输入
% T_train:训练样本输出
% hiddennum:隐含层神经元数
% P_test:测试样本输入
% T_test:测试样本期望输出
%% 输出
% Obj:所有个体的预测样本的预测误差的范数
[M,N]=size(X);
Obj=zeros(M,1);
for i=1:M
Obj(i)=BpFunction(X(i,:),P_train,T_train,hiddennum,P_test,T_test);
end
2、BpFunction.m
%% 输入
% x:一个个体的初始权值和阈值
% P_train:训练样本输入
% T_train:训练样本输出
% hiddennum:隐含层神经元数
% P_test:测试样本输入
% T_test:测试样本期望输出
%% 输出
% err:预测样本的预测误差的范数
function [err,T_sim]=BpFunction(x,P_train,T_train,hiddennum,P_test,T_test)
inputnum=size(P_train,2); % 输入层神经元个数
% hiddennum=2*inputnum+1; % 隐含层神经元个数
outputnum=size(T_train,2); % 输出层神经元个数
%% 数据归一化
[p_train,ps_train]=mapminmax(P_train',0,1);
p_test=mapminmax('apply',P_test',ps_train);
[t_train,ps_output]=mapminmax(T_train',0,1);
%% 开始构建BP网络
net=newff(p_train,t_train,hiddennum); %隐含层为hiddennum个神经元
%设定参数网络参数
net.trainParam.epochs=1000;
net.trainParam.goal=1e-3;
net.trainParam.lr=0.01;
net.trainParam.showwindow=false; %高版MATLAB使用 不显示图形框
%% BP神经网络初始权值和阈值
w1num=inputnum*hiddennum; %输入层到隐层的权值个数
w2num=outputnum*hiddennum; %隐含层到输出层的权值个数
W1=x(1:w1num); %初始输入层到隐含层的权值
B1=x(w1num+1:w1num+hiddennum); %隐层神经元阈值
W2=x(w1num+hiddennum+1:w1num+hiddennum+w2num); %隐含层到输出层的权值
B2=x(w1num+hiddennum+w2num+1:w1num+hiddennum+w2num+outputnum); %输出层阈值
net.iw{1,1}=reshape(W1,hiddennum,inputnum); %为神经网络的输入层到隐含层权值赋值
net.lw{2,1}=reshape(W2,outputnum,hiddennum); %为神经网络的隐含层到输出层权值赋值
net.b{1}=reshape(B1,hiddennum,1); %为神经网络的隐层神经元阈值赋值
net.b{2}=reshape(B2,outputnum,1); %为神经网络的输出层阈值赋值
%% 开始训练
net = train(net,p_train,t_train);
%% 测试网络
t_sim = sim(net,p_test);
T_sim = mapminmax('reverse',t_sim,ps_output); %反归一化
T_sim=T_sim';
err=norm(T_sim-T_test); %预测结果与测试结果差的范数,范数越小说明预测得越准确,如果范数为0,说明预测得完全准确