学习了解ELM(极限学习机);
(1)算法介绍
极限学习机,该算法随机产生输入层与隐含层的链接权值与隐含层神经元的阈值,并且在训练过程中无需调整,只要设置隐含层的神经元个数就可以得到最优解。
算法的步骤可以分为:
1.确定隐含层的神经元个数,随机设定输入层与隐含层的链接权值,和隐含层的神经元的偏置b
2.选择一个无限可微的函数作为隐含层神经元的激活函数(也叫压制函数)计算隐含层的输出H
3.计算输出层权值
非线性激活函数可以使用,也可以使用不可微函数,甚至可以使用不连续的函数作为激活函数。
(2)问题描述
单隐含层的前馈神经网络在很多的邻域得到了很好的应用,然而传统的学习算法有很多的缺点,比如说速度慢,容易陷入局部极小值点,对学习速率很敏感,容易过学习和欠学习,因此对于仪征可以速度快且泛化性能好的算法很重要。
适用于回归,拟合,也适用于分类、模式识别
(3)程序流程
ELM算法流程图
(4) 程序实现
1.用ELM做回归拟合
function [IW,B,LW,TF,TYPE] = elmtrain(P,T,N,TF,TYPE)
% 参数传递 Pn_train,Tn_train,20,'sig',0
%输入数据、输出数据、节点数、采取函数,采取模式
%根据参数数量判断
if nargin < 2
error('ELM:Arguments','Not enough input arguments.');
end
if nargin < 3
N = size(P,2);
end
if nargin < 4
TF = 'sig';
end
if nargin < 5
TYPE = 0;
end
if size(P,2) ~= size(T,2)
error('ELM:Arguments','The columns of P and T must be same.');
end
[R,Q] = size(P);
if TYPE == 1
T = ind2vec(T);%变成矢量表示
end
[S,Q] = size(T);
% Randomly Generate the Input Weight Matrix
IW = rand(N,R) * 2 - 1; %随机取权值
% Randomly Generate the Bias Matrix
B = rand(N,1); %随机取阈值
BiasMatrix = repmat(B,1,Q);%重新排列
% Calculate the Layer Output Matrix H
tempH = IW * P + BiasMatrix;%隐含层的输出
switch TF %根据采取的激活函数算出不同的输出
case 'sig'
H = 1 ./ (1 + exp(-tempH));
case 'sin'
H = sin(tempH);
case 'hardlim'
H = hardlim(tempH);
end
% Calculate the Output Weight Matrix
LW = pinv(H') * T'; %计算输出权重
function Y = elmpredict(P,IW,B,LW,TF,TYPE)
%输入数据,输入权重,阈值,隐含层输出层权值,隐含层节点数,模式选择
if nargin < 6%参数判断
error('ELM:Arguments','Not enough input arguments.');
end
Q = size(P,2);%计算输出层的输出H
BiasMatrix = repmat(B,1,Q);
tempH = IW * P + BiasMatrix;
switch TF %判断激活函数的模式
case 'sig'
H = 1 ./ (1 + exp(-tempH));
case 'sin'
H = sin(tempH);
case 'hardlim'
H = hardlim(tempH);
end
% Calculate the Simulate Output
Y = (H' * LW)';%计算输出层的输出
if TYPE == 1%模式选择
temp_Y = zeros(size(Y));
for i = 1:size(Y,2)
[max_Y,index] = max(Y(:,i));
temp_Y(index,i) = 1;
end
Y = vec2ind(temp_Y); %向量转换
End
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
2.ELM做分类
Tic %关键代码
%% ELM创建/训练
[IW,B,LW,TF,TYPE] = elmtrain(P_train,T_train,100,'sig',1);
%% ELM仿真测试
T_sim_1 = elmpredict(P_train,IW,B,LW,TF,TYPE);
T_sim_2 = elmpredict(P_test,IW,B,LW,TF,TYPE);
toc
(5)结果分析
时间已过 1.014221 秒。
训练集正确率Accuracy = 92.6%(463/500)
测试集正确率Accuracy = 86.9565%(60/69)
病例总数:569 良性:357 恶性:212
训练集病例总数:500 良性:313 恶性:187
测试集病例总数:69 良性:44 恶性:25
良性乳腺肿瘤确诊:42 误诊:2 确诊率p1=95.4545%
恶性乳腺肿瘤确诊:18 误诊:7 确诊率p2=72%
时间已过 0.257515 秒。
E =
6.7835e-04
R2 =
1.0000
ELM的预测误差图
ELM预测与对比图