ELM预测相关理论可查看上一篇博客: 极限学习机ELM回归预测
简单的ELM预测代码如下:
%初始化
clear
close all
clc
warning off
rng('default')
P=randi([1 10],3,100); %构建训练数据的输入样本
T=sum(P,1); %构建训练数据的输出样本
P1= randi([1 10],3,10); %构建测试数据的输入样本
T1=sum(P1,1); %构建测试数据的输出样本
% 归一化...使用mapminmax函数即可,由于生成的数据无量纲和数量级差异,跳过
%% ELM训练过程
N=3; %输入层的神经元节点个数
L=30; %隐含层的神经元节点个数
M=1; %输出层的神经元节点个数
IW=2*rand(L,N)-1; %初始化输入层与隐含层的连接权值,范围(-1,1)
B=rand(L,1); %初始化隐含层的偏置,范围(0,1)
tempH = IW * P + B; %计算隐含层的输出值
h= 1./ (1 + exp(tempH )); %使用映射函数G(x)=1/(1+exp(x)),h为隐含层对第样本特征的映射值
LW=pinv(h')*T'; %求逆,得到输出层的权值,结束训练(转置是为了让维度对应)
%% ELM预测过程
tempH1=IW*P1+B; %计算隐含层输出值
h1= 1./ (1 + exp(tempH1 )); %对特征作映射
ELM_OUT= (h1' * LW)';
%% 分析预测的误差
error=T1-ELM_OUT; %误差=实际值-预测值
disp(' 序号 期望值 预测值 误差')
disp([1:10
T1
ELM_OUT
error]')
disp('误差平方和...')
sse=sum(error.^2)
disp('均方误差...')
mse=mean(error.^2)
disp('平均相对误差...')
mape=mean(abs(error)./T1)
%作图分析预测的效果
figure
hold on
plot(1:10,T1,'bo:','linewidth',1.0)
plot(1:10,ELM_OUT,'r*-.','linewidth',1.0)
legend('期望值','预测值')
xlabel('测试样本序号')
ylabel('指标的值')
在理论与代码的实现过程中,注意到存在两个随机变量: 输入层与隐含层的连接权值IW,以及隐含层的阈值B.
IW=2*rand(L,N)-1; %随机初始化权值,服从(-1,1)均匀分布
B=rand(L,1); %随机初始化阈值,服从(0,1)均匀分布
针对ELM 随机产生的输入层权值和隐含层阈值导致网络不稳定的问题,采用遗传算法对极限学习机的权值和阈值进行优化,从而降低预测误差值,改善网络性能,得以提升ELM预测精度。
设极限学习机的输入层神经元节点数目为 n n n, 隐含层节点数目为 l l l,
输入层与隐含层的连接权值为 ω \omega ω:
ω = [ ω 11 ω 12 ⋯ β 1 n ω 21 ω 22 ⋯ β 2 n ⋮ ⋮ ⋮ ⋮ ω l 1 ω l 2 ⋯ β l n ] l × n \omega=\left[\begin{array}{cccc} \omega_{11} & \omega_{12} & \cdots & \beta_{1 n} \\ \omega_{21} & \omega_{22} & \cdots & \beta_{2 n} \\ \vdots & \vdots & \vdots & \vdots \\ \omega_{l 1} & \omega_{l 2} & \cdots & \beta_{l n} \end{array}\right]_{l \times n} ω=⎣⎢⎢⎢⎡ω11ω21⋮ωl1ω12ω22⋮ωl2⋯⋯⋮⋯β1nβ2n⋮βln⎦⎥⎥⎥⎤l×n
隐含层的阈值为 b b b:
b = [ b 1 b 2 ⋮ b l ] l × 1 b=\left[\begin{array}{c} b_{1} \\ b_{2} \\ \vdots \\ b_{l} \end{array}\right]_{l \times 1} b=⎣⎢⎢⎢⎡b1b2⋮bl⎦⎥⎥⎥⎤l×1
式中, ω 、 b \omega、b ω、b分别为矩阵和列向量。使用遗传算法等智能算法求解时,对于优化变量,采用向量型编码个体位置的方法操作较为简单。此外,还有矩阵编码,二进制编码等编码方式。此处采用向量型的浮点编码。
做法是: 先确定 ω \omega ω 与 b b b中元素变量的总数: n × l + l n\times l + l n×l+l,再生成等长度的初始种群位置向量。由 n n n 个个体组成的父代可表示如下:
X = [ x 1 1 x 1 2 … x 1 d x 2 1 x 2 2 … x 2 d … … … ⋯ x n 1 x n 2 … x n d ] X=\left[\begin{array}{cccc} x_{1}^{1} & x_{1}^{2} & \ldots & x_{1}^{d} \\ x_{2}^{1} & x_{2}^{2} & \ldots & x_{2}^{d} \\ \ldots & \ldots & \ldots & \cdots \\ x_{n}^{1} & x_{n}^{2} & \ldots & x_{n}^{d} \end{array}\right] X=⎣⎢⎢⎡x11x21…xn1x12x22…xn2…………x1dx2d⋯xnd⎦⎥⎥⎤
式中, d是变量维度, 且 d = n × l + l d = n\times l + l d=n×l+l.
根据ELM的训练公式:
∥ H β − T ∥ 2 = 0 \|\boldsymbol{H} \boldsymbol{\beta}-\boldsymbol{T}\|^{2}=0 ∥Hβ−T∥2=0
对上式求逆,解出输出层的权值 β \beta β,可得到一个训练好的极限学习机模型。因而当该方程可解 ( H H H的逆矩阵存在) 时,得到的模型对训练样本是无误差的。GA优化目的是针对随机初始化权值阈值带来的网络预测不稳定,通过优化权值和阈值,提升预测精度。因此,将训练集与测试集整体的均方误差作为适应度函数。适应度函数值越小,表明训练越准确,且兼顾模型的预测精度更好。
F = min ( M S E Trainingset , Testingset ) F=\min \left(M S E_{\text {Trainingset }, \text { Testingset }}\right) F=min(MSETrainingset , Testingset )
式中,TraingingSet,TestingSet,分别为训练集和测试集的样本。
身体脂肪数据集 bodyfatDataset 是深度学习中常用的预测数据集,对该数据集的描述如下:
bodyfatInputs - a 13x252 matrix defining thirteen attributes for 252
people.
1. Age (years)
2. Weight (lbs)
3. Height (inches)
4. Neck circumference (cm)
5. Chest circumference (cm)
6. Abdomen 2 circumference (cm)
7. Hip circumference (cm)
8. Thigh circumference (cm)
9. Knee circumference (cm)
10. Ankle circumference (cm)
11. Biceps (extended) circumference (cm)
12. Forearm circumference (cm)
13. Wrist circumference (cm)
bodyfatTargets - a 1x252 matrix of associated body fat percentages,
to be estimated from the inputs.
整理到EXCEL中, 数据形式如下:
样本序号 | 输入指标1 | 输入指标2 | … | 输出指标 |
---|---|---|---|---|
1 | - | – | – | – |
2 | - | – | – | – |
… | - | – | – | – |
n | - | – | – | – |
由于不同变量的单位和取值范围差异较大,为了消除变量之间数量级的差别避免造成预测误差,以及方便求解,将数据进行归一化处理是实现预测前对数据常做的处理。采用MATLAB 自带归一化函数mapmin max 将所有数据都转化为[- 1,1]之间的数据。函数调用方式如下:
[pn,ps] = mapminmax( p)
式中, p是输入原始数据, pn 是归一化的数据, ps是记录数据归一化操作的结构体。输出数据的归一化同理,预测完成后同样利用此函数进行反归一化,获得真实数据。
确定ELM的结构参数:
% 1. 输入层神经元节点数,
inputnum=size(input,2); % input的行向对应输入指标个数
% 2. 输出层的神经元节点数,
outputnum=size(output,2); % output的行向对应输出指标个数
disp('/')
disp('极限学习机ELM结构...')
disp(['输入层的节点数为:',num2str(inputnum)])
disp(['输出层的节点数为:',num2str(outputnum)])
disp(' ')
disp('隐含层节点的确定过程...')
% 3. 确定隐含层的神经元节点个数
%注意:BP神经网络确定隐含层节点的方法是:采用经验公式hiddennum=sqrt(m+n)+a,m为输入层节点个数,n为输出层节点个数,a一般取为1-10之间的整数
%在极限学习机中,该经验公式往往会失效,设置较大的范围进行隐含层节点数目的确定即可。
MSE=1e+5; %初始化最小误差
for hiddennum=20:30
...
%更新最佳的隐含层节点
if minMse<MSE
MSE=minMse;
hiddennum_best=hiddennum;
end
初始化遗传算法的参数:
nvars=inputnum*hiddennum_best+hiddennum_best; %自变量个数
PopulationSize_Data=30; %种群规模
MaxGenerations_Data=50; %最大进化代数
CrossoverFraction_Data=0.8; %交叉概率
MigrationFraction_Data=0.2; %变异概率
4.1 GA的进化曲线,含最优的适应度值与平均适应度
4.3 优化前后的预测曲线对比 (绿色为实测值, 红色为GA-ELM预测值, 蓝色为ELM预测值)
见博客主页