1 模型
为了提高空气质量预测精度,提出一种基于粒子群算法优化极限学习机的空气质量预测模型.运用粒子群算法优化极限学习机的初始权值和偏置,在保证预测误差最小的情况下实现空气质量最优预测.选择平均绝对百分比误差,均方根误差和平均绝对误差作为评价指标,通过PSO-ELM和ELM五个模型预测结果对比发现,PSO-ELM可以有效提高空气质量预报的预测精度,可为空气质量预测提供新的方法和途径.
2 部分代码
%% 初始化
clear
close all
clc
format shortg
warning off
addpath('func_defined')
%% 读取读取
data_train=xlsread('Data-tiaoshi.xlsx','Train','A1:E90'); %%使用xlsread函数读取EXCEL中对应范围的数据即可
data_test=xlsread('Data-tiaoshi.xlsx','Test','A1:D20'); %%使用xlsread函数读取EXCEL中对应范围的数据即可
%输入输出数据%% 划分训练集、测试集
input=data_train(:,1:end-1); %data的第一列-倒数第二列为特征指标
output=data_train(:,end); %data的最后面一列为输出的指标值
% output_test=data_test(:,end)'; %data的最后面一列为输出的指标值
N=length(output); %全部样本数目
testNum=15; %设定测试样本数目
trainNum=N-testNum; %计算训练样本数目
input_train = input(1:trainNum,:)';
output_train =output(1:trainNum)';
input_test =input(trainNum+1:trainNum+testNum,:)';
output_test =output(trainNum+1:trainNum+testNum)';
%% 数据归一化
[inputn,inputps]=mapminmax(input_train,-1,1);
[outputn,outputps]=mapminmax(output_train);
inputn_test=mapminmax('apply',input_test,inputps);
%% 绘制进化曲线
figure(1)
plot(Convergence_curve,'r-','linewidth',2)
xlabel('进化代数')
ylabel('均方误差')
legend('最佳适应度')
title('PSO的进化曲线')
%% 优化后的参数训练ELM极限学习机模型
[IW1,B1,LW1,TF,TYPE] = elmtrain(inputn,outputn,hiddennum_best,gbest); %IW1 B1 LW1为优化后的ELM求得的训练参数
%% 优化后的ELM模型测试
an1=elmpredict(inputn_test,IW1,B1,LW1,TF,TYPE);
test_simu1=mapminmax('reverse',an1,outputps);
%误差指标
[mae1,mse1,rmse1,mape1,error1,errorPercent1]=calc_error(output_test,test_simu1);
%% 作图
figure(2)
plot(output_test,'g-.o','linewidth',1)
hold on
plot(test_simu0,'b-*','linewidth',1)
hold on
plot(test_simu1,'r-v','linewidth',1)
legend('真实值','ELM预测值','PSO-ELM预测值')
xlabel('测试样本编号')
ylabel('指标值')
title('优化前后的ELM模型预测值和真实值对比图')
figure(3)
plot(error0,'b-*','markerfacecolor','r')
hold on
plot(error1,'r-v','markerfacecolor','r')
legend('ELM预测误差','PSO-ELM预测误差')
xlabel('测试样本编号')
ylabel('预测偏差')
title('优化前后的ELM模型预测值和真实值误差对比图')
disp(' ')
disp('/')
disp('打印结果表格')
disp('样本序号 实测值 ELM预测值 PSO-ELM值 ELM误差 PSO-ELM误差')
for i=1:testNum
disp([i output_test(i),test_simu0(i),test_simu1(i),error0(i),error1(i)])
end
input_test2=data_test(:,1:end)'; %data的第一列-倒数第二列为特征指标
inputn_test2=mapminmax('apply',input_test2,inputps);
an2=elmpredict(inputn_test2,IW1,B1,LW1,TF,TYPE);
test_simu2=mapminmax('reverse',an2,outputps);
figure(5)
plot(test_simu2,'b-')
xlabel('测试样本编号')
ylabel('指标值')
3 仿真结果