虽然ELM极限学习机有很多的争议,但是也有他一定的优点,今天,我们采用同一组数据分别使用,BP与ELM来做回归分析,采用的是y=x1^2+x2^2的数据,做的是非线性回归。
代码如下:
clear all clc %% 导入数据 load data % 随机生成训练集、测试集 k = randperm(size(input,1)); %%%返回行数,并产生随机的2000个数。 % 训练集——1900个样本 P_train=input(k(1:1900),:)'; T_train=output(k(1:1900)); % 测试集——100个样本 P_test=input(k(1901:2000),:)'; T_test=output(k(1901:2000)); %% 归一化 % 训练集 [Pn_train,inputps] = mapminmax(P_train,-1,1); Pn_test = mapminmax('apply',P_test,inputps); % 测试集 [Tn_train,outputps] = mapminmax(T_train,-1,1); Tn_test = mapminmax('apply',T_test,outputps); tic %% ELM创建/训练 [IW,B,LW,TF,TYPE] = elmtrain(Pn_train,Tn_train,20,'sig',0); %% ELM仿真测试 Tn_sim = elmpredict(Pn_test,IW,B,LW,TF,TYPE); % 反归一化 T_sim = mapminmax('reverse',Tn_sim,outputps); toc %% 结果对比 result = [T_test' T_sim']; %100*2 % 均方误差 E = mse(T_sim - T_test) % 决定系数 N = length(T_test); R2 = (N*sum(T_sim.*T_test)-sum(T_sim)*sum(T_test))^2/((N*sum((T_sim).^2)-(sum(T_sim))^2)*(N*sum((T_test).^2)-(sum(T_test))^2))
结果如下:
时间已过 0.082643 秒。
E =
2.0077e-04
---------------------------------------------------------------
这是BP神经网络做的同一个数据的非线性回归预测:
clc clear %% 训练数据预测数据提取及归一化 %下载输入输出数据 load data input output %从1到2000间随机排序 k=rand(1,2000); [m,n]=sort(k); %找出训练数据和预测数据 input_train=input(n(1:1900),:)'; output_train=output(n(1:1900)); input_test=input(n(1901:2000),:)'; output_test=output(n(1901:2000)); %选连样本输入输出数据归一化 [inputn,inputps]=mapminmax(input_train); [outputn,outputps]=mapminmax(output_train); %% BP网络训练 % %初始化网络结构 tic; net=newff(inputn,outputn,5); net.trainParam.epochs=100; net.trainParam.lr=0.1; net.trainParam.goal=0.00004; %网络训练 net=train(net,inputn,outputn); %% BP网络预测 %预测数据归一化 inputn_test=mapminmax('apply',input_test,inputps); %网络预测输出 an=sim(net,inputn_test); %网络输出反归一化 BPoutput=mapminmax('reverse',an,outputps); toc; %% 结果分析 %{ figure(1) plot(BPoutput,':og') saveas(gcf,'a.jpg'); hold on plot(output_test,'-*'); legend('预测输出','期望输出') title('BP网络预测输出','fontsize',12) ylabel('函数输出','fontsize',12) xlabel('样本','fontsize',12) saveas(gcf,'ab.jpg'); %预测误差 error=BPoutput-output_test; %} %{ figure(2) plot(error,'-*') title('BP网络预测误差','fontsize',12) ylabel('误差','fontsize',12) xlabel('样本','fontsize',12) saveas(gcf,'c.jpg'); figure(3) plot((output_test-BPoutput)./BPoutput,'-*'); title('神经网络预测误差百分比') saveas(gcf,'d.jpg'); errorsum=sum(abs(error)) %} E = mse(BPoutput - output_test)结果如下:
时间已过 6.789430 秒。
E =
0.0159
相比来说:
ELM的速度上很占优势,快近2个单位级,而且误差也十分的小,尽管有争议,也值得我们来使用。