clear
close all
%% 数据读取
geshu=30;%训练集的个数
%读取数据
shuru=xlsread('数据的输入.xlsx');
shuchu=xlsread('数据的输出.xlsx');
%nn = randperm(size(shuru,1));%随机排序
nn=1:size(shuru,1);%正常排序
input_train =shuru(nn(1:geshu),:);
input_train=input_train';
output_train=shuchu(nn(1:geshu),:);
output_train=output_train';
input_test =shuru(nn((geshu+1):end),:);
input_test=input_test';
output_test=shuchu(nn((geshu+1):end),:);
output_test=output_test';
%样本输入输出数据归一化
[aa,bb]=mapminmax([input_train input_test]);
[cc,dd]=mapminmax([output_train output_test]);
global inputn outputn shuru_num shuchu_num
[inputn,inputps]=mapminmax('apply',input_train,bb);
[outputn,outputps]=mapminmax('apply',output_train,dd);
shuru_num = size(input_train,1); % 输入维度
shuchu_num = 1; % 输出维度
%%
% 1. 寻找最佳参数
NN=5; %初始化群体个数
D=2; %初始化群体维数,
T=10; %初始化群体最迭代次数
c1=2; %学习因子1
c2=2; %学习因子2
%用线性递减因子粒子群算法
Wmax=1.2; %惯性权重最大值
Wmin=0.8; %惯性权重最小值
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%每个变量的取值范围
ParticleScope(1,:)=[10 200]; % 中间层神经元个数
ParticleScope(2,:)=[0.01 0.15]; % 学习率
ParticleScope=ParticleScope';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
xv=rand(NN,2*D); %首先,初始化种群个体速度和位置
for d=1:D
xv(:,d)=xv(:,d)*(ParticleScope(2,d)-ParticleScope(1,d))+ParticleScope(1,d);
xv(:,D+d)=(2*xv(:,D+d)-1 )*(ParticleScope(2,d)-ParticleScope(1,d))*0.2;
end
x1=xv(:,1:D);%位置
v1=xv(:,D+1:2*D);%速度
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%------初始化个体位置和适应度值-----------------
p1=x1;
pbest1=ones(NN,1);
for i=1:NN
pbest1(i)=fitness(x1(i,:));
end
%------初始时全局最优位置和最优值---------------
gbest1=min(pbest1);
lab=find(min(pbest1)==pbest1);
g1=x1(lab,:);
gb1=ones(1,T);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%-----浸入主循环,按照公式依次迭代直到迭代次数---
% N=40; %初始化群体个数
% D=10; %初始化群体维数
% T=100; %初始化群体最迭代次数
for i=1:T
for j=1:NN
if (fitness(x1(j,:))<pbest1(j))
p1(j,:)=x1(j,:);%变量
pbest1(j)=fitness(x1(j,:));
end
if(pbest1(j)<gbest1)
g1=p1(j,:);%变量
gbest1=pbest1(j);
end
w=Wmax-(Wmax-Wmin)*i/T;
v1(j,:)=w*v1(j,:)+c1*rand*(p1(j,:)-x1(j,:))+c2*rand*(g1-x1(j,:));
x1(j,:)=x1(j,:)+v1(j,:);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%位置约束
label=find(x1(j,:)>ParticleScope(2,:));
x1(j,label)=ParticleScope(2,label);
label2=find(x1(j,:)<ParticleScope(1,:));
x1(j,label2)=ParticleScope(1,label2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%速度约束
labe3=find(v1(j,:)>ParticleScope(2,:)*0.2);
v1(j,labe3)=ParticleScope(2,labe3)*0.2;
label4=find(v1(j,:)<-ParticleScope(2,:)*0.2);
v1(j,label4)=-ParticleScope(2,label4)*0.2;
end
gb1(i)=min(pbest1);
end
zhongjian1_num = round(g1(1));
xue = g1(2);
%% 模型建立与训练
layers = [ ...
sequenceInputLayer(shuru_num) % 输入层
lstmLayer(zhongjian1_num) % LSTM层
fullyConnectedLayer(shuchu_num) % 全连接层
regressionLayer];
options = trainingOptions('adam', ... % 梯度下降
'MaxEpochs',50, ... % 最大迭代次数
'GradientThreshold',1, ... % 梯度阈值
'InitialLearnRate',xue,...
'Verbose',0, ...
'Plots','training-progress'); % 学习率
%% 训练LSTM
net = trainNetwork(inputn,outputn,layers,options);
%% 预测
net = resetState(net);% 网络的更新状态可能对分类产生了负面影响。重置网络状态并再次预测序列。
[~,Ytrain]= predictAndUpdateState(net,inputn);
test_simu=mapminmax('reverse',Ytrain,dd);%反归一化
rmse = sqrt(mean((test_simu-output_train).^2)); % 训练集
%测试集样本输入输出数据归一化
inputn_test=mapminmax('apply',input_test,bb);
[net,an]= predictAndUpdateState(net,inputn_test);
test_simu1=mapminmax('reverse',an,dd);%反归一化
error1=test_simu1-output_test;%测试集预测-真实
%计算均方根误差 (RMSE)。
rmse1 = sqrt(mean((test_simu1-output_test).^2)); % 测试集
步骤1 将实验数据分为训练数据、验证数据和测试数据。
步骤2 将LSTM 模型中时间窗口大小、批处理大小、神经网络隐藏层单元数目作为优化对象,初始化自适应PSO 算法。
步骤3 划分子群。
步骤4 计算每个粒子的适应度值。以各粒子对应参数构建LSTM 模型,通过训练数据进行训练,验证数据进行预测,将预测结果的平均绝对百分比误差作为各粒子的适应度值。
步骤5 根据粒子适应度值与种群划分结果,确定全局最优粒子位置pbest 和局部最优粒子位置gbest。
步骤6 根据PSO 算法的分别对普通粒子和局部最优粒子位置进行更新。
步骤7 判断终止条件。若满足终止条件,返回最优超参数取值; 否则,返回步骤3。
步骤8 利用最优超参数构建LSTM 模型。
步骤9 模型通过训练数据和验证数据进行训练,测试集进行预测,得到预测结果。
预测应该是输入前面的话,输出后面的话,比如输入我是,输出就是中国人,这种算预测,一般lstm都是这么输入的,另外你的数据应该多一点
LSTM算法
循环神经网络(RNN)是一种专门用来处理序列数据的神经网络。和一般神经网络不同的是,它能有效的提取到序列之间的信息。比如单词会因为上下文的不同而导致词义发生变化。但传统循环神经网络面对长序列时容易发生梯度消失以及梯度爆炸的问题。为了解决RNN所存在的问题,LSTM作为它的一种变种被提了出来。
长短时记忆网络(LSTM)主要用于解决RNN中梯度消失和爆炸的问题,因此在面对长序列数据时有着良好的表现。其网络结构如图1所示。
Figure 1. LSTM structure
图1. LSTM结构图
相较于传统RNN只会传递 Ct,LSTM同时还会给下一个时刻传递当前的细胞状态 Ht。也就是说比起RNN,LSTM不仅会告诉下一个时刻当前的细胞状态,同时还会传递隐层的状态,这为后续一系列的门运算提供了基础。
LSTM主要包含了三个门:遗忘门、输入们、输出门。
1遗忘门:这是LSTM的遗忘阶段,主要时为了忘掉长序列数据中不重要的信息。由于激活函数是sigmoid所以输出在0和1之间。其中1表示保留,0表示遗弃。其更新公式如公式1所示:
f=σ(Wf⋅[Ht−1,Xt]+bf)(1)
2输入门:这是LSTM的选择记忆阶段,这个阶段会将输入有选择性地进行“记忆”。主要是会对输入 Xt 进行选择记忆。重要的信息多记一些,不重要的则需要少记。激活函数主要有sigmoid和tanh。公式如2~4所示
it=σ(Wf⋅[Ht−1,Xt]+bf)(2)
C˜=tanh(WC⋅[Ht−1,Xt]+bC)(3)
Ct=ft∗Ct−1+it∗Ct(4)
3输出门:这是LSTM的输出阶段。这个阶段将要决定哪些信息会被当做当前状态而输出。此阶段结合前面两个阶段给出的信息做出判断。此阶段的激活函数也有两个为sigmoid和tanh。其更新公式如5~6所示:
ot=σ(Wo⋅[Ht−1,Xt]+bo)(5)
ht=ot∗tanh(Ct)(6)
训练LSTM网络可以应用时序性倒传递算法,依据错误修改每次的权重。梯度下降法在循环网络神经网络(RNN)会导致误差梯度随着事件间的时间长度成指数般的消失。但是当设置了LSTM单元时,误差也随着倒回计算,从输出影响回输入阶段的每一个门,直到这个数值被过滤掉。因此正常的倒传递类神经是一个有效训练LSTM区块记住长时间数值的方法。LSTM的内部结构主要就是通过门控状态来控制传输状态,能记住关键的信息,忘记长序列信息中不需要的信息,不同于普通的RNN那样仅仅只有一种记忆叠加方式。这对网络安全态势预测这种长序列数据来说,是一种非常有效的网络。
PSO算法
粒子群优化(PSO, particle swarm optimization)算法时一种基于生物启发的群体智能优化算法,源于对鸟类捕食的研究。本文采用PSO算法对LSTM中的超参数进行寻优,从而得到整个网络的最优参数组合。
对于一个j的优化问题,种群中共有i个粒子,对于每个粒子都有j维度的速度和位置两个向量。模拟整个鸟群的飞行过程,不断调整第i个粒子的最优位置,最终找到整个粒子群最优的位置。应用于LSTM中,其具体步骤如下所示:
步骤1:初始化算法相关参数,确定种群规模,迭代次数,惯性权重和学习因子的变化区间。
步骤2:随机生成一个三维的种群粒子,每个维度都是我们更新模型的误差参数同时并初始化粒子的位置和速度。所以粒子的维度就是我们需要优化的参数。
步骤3:以LSTM模型的损失函数作为粒子的适应度函数,适应度函数越大说明模型的损失。
函数越大,所以我们要尽量使适应度变小。这样求得的粒子参数组合越好。计算每个粒子的适应度函数,根据适应度函数确定个体最佳位置和群体最佳位置。
步骤4:迭代过程中不断更新粒子的位置和速度,再重新算出每个粒子的适应度函数并更新个体最佳位置和群体最佳位置。
步骤5:当达到迭代次数或粒子的适应度函数趋于稳定时则停止,作为群体最佳位置的粒子为本次求得的最优参数组合,否则转步骤4继续迭代。其流程图如图2所示。
https://www.hanspub.org/journal/PaperInformation.aspx?paperID=38401&btwaf=35253350