(转载)极限学习机(extreme learning machine, ELM)的回归拟合及分类(matlab实现)

news2024/11/26 15:41:14
        单隐含层前馈神经网络(single-hidden layer feedforward neural network,SLFN)以其良好的学习能力在许多领域中得到了广泛的应用。然而,传统的学习算法(如BP算法等)固有的一些缺点,成为制约其发展的主要瓶颈。前馈神经网络大多采用梯度下降方法,该方法主要存在以下几个方面的缺点:
        (1)训练速度慢。由于梯度下降法需要多次迭代以达到修正权值和阈值的目的,因此训练过程耗时较长。
        (2)容易陷入局部极小点,无法达到全局最小。
        (3)学习率η的选择敏感。学习率η对神经网络的性能影响较大,必须选择合适的η,才能获得较为理想的网络。若η太小,则算法收敛速度很慢,训练过程耗时较长;反之,若η太大,则训练过程可能不稳定(收敛)。
        因此,探索一种训练速度快、获得全局最优解,且具有良好的泛化性能的训练算法是提升前馈神经网络性能的主要目标,也是近年来的研究热点和难点。
        本章将介绍一个针对SLFN的新算法——极限学习机(extreme learning machine, ELM),该算法随机产生输入层与隐含层间的连接权值及隐含层神经元的阈值,且在训练过程 中无需调整,只需要设置隐含层神经元的个数,便可以获得唯一的最优解。与传统的训练方法相比,该方法具有学习速度快、泛化性能好等优点。
        同时,在介绍ELM算法的基础上,本章以实例的形式将该算法分别应用于回归拟合和分类。

1 理论基础

1.1 ELM的基本思想

 

        典型的单隐含层前馈神经网络结构如图30-1所示,该网络由输入层、隐含层和输出层组成,输入层与隐含层、隐含层与输出层神经元间全连接。其中,输入层有n个神经元,对应n个输入变量;隐含层有l个神经元;输出层有m个神经元,对应m个输出变量。不失一般性,设输入层与隐含层间的连接权值w为

1.2 ELM的学习算法

        由前文分析可知,ELM在训练之前可以随机产生w和b,只需确定隐含层神经元个数及隐含层神经元的激活函数(无限可微),即可计算出β。具体地,ELM的学习算法主要有以下几个步骤:

        值得一提的是,相关研究结果表明,在ELM中不仅许多非线性激活函数都可以使用,如S型函数、正弦函数和复合函数等,还可以使用不可微函数,甚至可以使用不连续的函数作为激活函数。

1.3 ELM的MATLAB实现

        按照上述步骤,可以方便地在MATLAB环境下实现ELM的学习算法。

1.ELM训练函数elmtrain

        函数elmtrain为ELM的创建/训练函数,其调用格式为
[IW,B,LN,TF,TYPE]=elmtrain(P,T,N,TF,TYPE)
        其中,P为训练集的输入矩阵;T为训练集的输出矩阵;N为隐含层神经元的个数(默认为 训练集的样本数);TF为隐含层神经元的激活函数,其取值可以为'sig'(默认)、'sin'、'hardlim';TYPE为ELM的应用类型,其取值可以为0(默认,表示回归、拟合)和1(表示分类);IW为输入层与隐含层间的连接权值;B为隐含层神经元的阈值;LW为隐含层与输出层的连接权值。
        matlab代码如下:
function [IW,B,LW,TF,TYPE] = elmtrain(P,T,N,TF,TYPE)
% ELMTRAIN Create and Train a Extreme Learning Machine
% Syntax
% [IW,B,LW,TF,TYPE] = elmtrain(P,T,N,TF,TYPE)
% Description
% Input
% P   - Input Matrix of Training Set  (R*Q)
% T   - Output Matrix of Training Set (S*Q)
% N   - Number of Hidden Neurons (default = Q)
% TF  - Transfer Function:
%       'sig' for Sigmoidal function (default)
%       'sin' for Sine function
%       'hardlim' for Hardlim function
% TYPE - Regression (0,default) or Classification (1)
% Output
% IW  - Input Weight Matrix (N*R)
% B   - Bias Matrix  (N*1)
% LW  - Layer Weight Matrix (N*S)
% Example
% Regression:
% [IW,B,LW,TF,TYPE] = elmtrain(P,T,20,'sig',0)
% Y = elmtrain(P,IW,B,LW,TF,TYPE)
% Classification
% [IW,B,LW,TF,TYPE] = elmtrain(P,T,20,'sig',1)
% Y = elmtrain(P,IW,B,LW,TF,TYPE)
% See also ELMPREDICT
% Yu Lei,11-7-2010
% Copyright www.matlabsky.com
% $Revision:1.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';

2.ELM预测函数elmpredict

        函数elmpredict为ELM的预测函数,其调用格式为
Y=elmpredict(P,IN,B,LN,TF,TYPE)
        其中,P为测试集的输入矩阵;IW为函数elmtrain返回的输入层与隐含层间的连接权值;B为函数elmtrain返回的隐含层神经元的阈值;LW为函数elmtrain返回隐含层与输出层的连接权值;TF为与函数elmtrain中一致的激活函数类型;TYPE为与函数elmtrain中一致的ELM应用类型;Y为测试集对应的输出预测值矩阵。
        matlab代码如下:
function Y = elmpredict(P,IW,B,LW,TF,TYPE)
% ELMPREDICT Simulate a Extreme Learning Machine
% Syntax
% Y = elmtrain(P,IW,B,LW,TF,TYPE)
% Description
% Input
% P   - Input Matrix of Training Set  (R*Q)
% IW  - Input Weight Matrix (N*R)
% B   - Bias Matrix  (N*1)
% LW  - Layer Weight Matrix (N*S)
% TF  - Transfer Function:
%       'sig' for Sigmoidal function (default)
%       'sin' for Sine function
%       'hardlim' for Hardlim function
% TYPE - Regression (0,default) or Classification (1)
% Output
% Y   - Simulate Output Matrix (S*Q)
% Example
% Regression:
% [IW,B,LW,TF,TYPE] = elmtrain(P,T,20,'sig',0)
% Y = elmtrain(P,IW,B,LW,TF,TYPE)
% Classification
% [IW,B,LW,TF,TYPE] = elmtrain(P,T,20,'sig',1)
% Y = elmtrain(P,IW,B,LW,TF,TYPE)
% See also ELMTRAIN
% Yu Lei,11-7-2010
% Copyright www.matlabsky.com
% $Revision:1.0 $
if nargin < 6
    error('ELM:Arguments','Not enough input arguments.');
end
% Calculate the Layer Output Matrix H
Q = size(P,2);
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
       
    

2 案例背景

2.1 问题描述

        ELM以其学习速度快、泛化性能好等优点,引起了国内外许多专家学者的研究与关注。ELM不仅适用于回归、拟合问题,亦适用于分类、模式识别等领域,因此,其在各个领域中取得了广泛的应用。同时,不少改进的方法与策略也被不断提及,ELM的性能也得到了很大的提升,其应用的范围亦愈来愈广,其重要性亦日益体现出来。
        为了评价ELM的性能,试分别将ELM应用于基于近红外光谱的汽油辛烷值测定和鸢尾花种类识别两个问题中,并将其结果与传统前馈网络(BP、RBF、GRNN、PNN等)的性能和运行速度进行比较,并探讨隐含层神经元个数对ELM性能的影响。

2.2 解题思路及步骤

        依据问题描述中的要求,实现ELM的创建/训练及仿真测试,大体上可以分为以下几个步骤,如图30-2所示。

1.产生训练集/测试集

        与传统前馈神经网络相同,为了使得建立的模型具有良好的泛化性能,要求具有足够多的训练样本且具有较好的代表性。同时,训练集和测试集的格式应符合ELM训练和预测函数的要求。

2.创建/训练ELM

        利用函数elmtrain可以方便地创建/训练ELM,具体用法请参考第3节。值得一提的是,如前文所述,隐含层神经元个数对ELM的性能影响较大,因此,需要选择一个合适的隐含层神经元个数,具体讨论参见第4节。

3.ELM仿真测试

        利用函数elmpredict可以方便地进行ELM的仿真测试,具体用法请参考第3节。

4.性能评价

        通过计算测试集预测值与真实值间的误差(均方误差、决定系数、正确率等),可以对模型的泛化能力进行评价。同时,可以对比ELM与传统前馈神经网络的运行时间,从而对ELM的运算速度进行评价。

3 MATLAB程序实现

        利用MATLAB及1.3小节中自定义的函数,可以方便地在MATLAB环境下实现上述步骤。

3.1 ELM的回归拟合——基于近红外光谱的汽油辛烷值预测

%% Part1:ELM的回归拟合——基于近红外光谱的汽油辛烷值预测
clear all
clc

%% 训练集/测试集产生
load spectra_data.mat
% 随机产生训练集和测试集
temp = randperm(size(NIR,1));
% 训练集——50个样本
P_train = NIR(temp(1:50),:)';
T_train = octane(temp(1:50),:)';
% 测试集——10个样本
P_test = NIR(temp(51:end),:)';
T_test = octane(temp(51:end),:)';
N = size(P_test,2);

%% 数据归一化

% 训练集
[Pn_train,inputps] = mapminmax(P_train);
Pn_test = mapminmax('apply',P_test,inputps);
% 测试集
[Tn_train,outputps] = mapminmax(T_train);
Tn_test = mapminmax('apply',T_test,outputps);

%% ELM创建/训练
[IW,B,LW,TF,TYPE] = elmtrain(Pn_train,Tn_train,30,'sig',0);

%% ELM仿真测试
tn_sim = elmpredict(Pn_test,IW,B,LW,TF,TYPE);
% 反归一化
T_sim = mapminmax('reverse',tn_sim,outputps);

%% 结果对比
result = [T_test' T_sim'];
% 均方误差
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)); 

%% 绘图
figure(1)
plot(1:N,T_test,'r-*',1:N,T_sim,'b:o')
grid on
legend('真实值','预测值')
xlabel('样本编号')
ylabel('辛烷值')
string = {'测试集辛烷值含量预测结果对比(ELM)';['(mse = ' num2str(E) ' R^2 = ' num2str(R2) ')']};
title(string)

3.2ELM的分类——鸢尾花种类识别

%% Part2:ELM的分类——鸢尾花种类识别
clear all
clc

%% 训练集/测试集产生
load iris_data.mat
% 随机产生训练集和测试集
P_train = [];
T_train = [];
P_test = [];
T_test = [];
for i = 1:3
    temp_input = features((i-1)*50+1:i*50,:);
    temp_output = classes((i-1)*50+1:i*50,:);
    n = randperm(50);
    % 训练集——120个样本
    P_train = [P_train temp_input(n(1:40),:)'];
    T_train = [T_train temp_output(n(1:40),:)'];
    % 测试集——30个样本
    P_test = [P_test temp_input(n(41:50),:)'];
    T_test = [T_test temp_output(n(41:50),:)'];
end

%% ELM创建/训练
[IW,B,LW,TF,TYPE] = elmtrain(P_train,T_train,20,'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);

%% 结果对比
result_1 = [T_train' T_sim_1'];
result_2 = [T_test' T_sim_2'];
% 训练集正确率
k1 = length(find(T_train == T_sim_1));
n1 = length(T_train);
Accuracy_1 = k1 / n1 * 100;
disp(['训练集正确率Accuracy = ' num2str(Accuracy_1) '%(' num2str(k1) '/' num2str(n1) ')'])
% 测试集正确率
k2 = length(find(T_test == T_sim_2));
n2 = length(T_test);
Accuracy_2 = k2 / n2 * 100;
disp(['测试集正确率Accuracy = ' num2str(Accuracy_2) '%(' num2str(k2) '/' num2str(n2) ')'])

%% 绘图
figure(2)
plot(1:30,T_test,'bo',1:30,T_sim_2,'r-*')
grid on
xlabel('测试集样本编号')
ylabel('测试集样本类别')
string = {'测试集预测结果对比(ELM)';['(正确率Accuracy = ' num2str(Accuracy_2) '%)' ]};
title(string)
legend('真实值','ELM预测值')

4 延伸阅读

4.1 隐含层神经元个数的影响

        图30-5所示为隐含层神经元个数对ELM性能的影响(以鸢尾花种类识别为例),如图所示,当隐含层神经元个数与训练集样本个数相等时,ELM可以以零误差逼近所有训练样本。然而,并非隐含层神经元个数越多越好,从测试集的预测正确率可以看出,当隐含层神经元个数逐渐增加时,测试集的预测率呈逐渐减小的趋势。因此,需要综合考虑训练集和测试集的预测正确率,进行折中选择。

4.2 案例延伸

        ELM以其学习速度快、泛化性能好、调节参数少等优点,在各个领域中取得了广泛的应用。随着研究的深入,一些专家提出了许多改进方法,如在线学习ELM、进化ELM等,同时,一些学者将其他算法中的思想(如SVM中的结构风险最小等)引入ELM中,亦取得了不错的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/740209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云服务器安装mysql并用idea连接

文章目录 前言一.购置阿里云服务器——不定时二.在服务器安装mysql——用时5分钟三.打开服务器mysql的端口——用时2分钟1.找到安全组2.打开默认mysql的3306端口 三.打开idea连接数据库——5分钟四.总用时大约20分钟 前言 记录第一次通过idea连接安装在服务器上的数据库——排错…

在vite创建的vue3项目中加载Cesium世界街道地图的底图

在vite创建的vue3项目中加载Cesium世界街道地图的底图 使用vite创建vue3项目 npm create vitelatestcd到创建的项目文件夹中 npm install安装Cesium npm i cesium vite-plugin-cesium vite -D配置 vite.config.js文件 import { defineConfig } from vite import vue from vitej…

ETHERCAT转PROFINET协议网关连接ethercat网线接口定义

大家好&#xff0c;今天我要给大家介绍一款神奇的产品&#xff0c;YC-PN-ECT&#xff0c;它是一款 PROFINET 从站功能的通讯网关&#xff0c;可以将 PROFINET 网络和 ETHERCAT 网络连接起来&#xff0c;让不同厂家的 PLC 能够互相通信&#xff0c;真是太酷了&#xff01; PEO…

T100新增栏位,配置ACC作业并提供开窗作业维护

需求分析:将xxxx作业中的一个界面新增一个栏位,并提供开窗功能进行资料的维护。 一、ACC自适应配置文档开发 1.1 azzi650 注册应用分类码【ACC】 新增一个资料 应用分类码【数字】说明 填写文字说明作业编号:这个时候是空的作业名称:也是空的1.2 azzi910 作业基本维护 这个…

做爬虫如何选择Python和C语言

目录 优劣势分析 Python 进行爬虫的优势&#xff1a; Python 进行爬虫的劣势&#xff1a; C进行爬虫的优势&#xff1a; C进行爬虫的劣势&#xff1a; 示例代码说明 Python 示例代码&#xff1a; C语言 示例代码&#xff1a; 怎么选择 优劣势分析 Python 进行爬虫的优…

Java设计模式之创建型-原型模式(UML类图+案例分析)

一、基础概念 通过复制已有对象作为原型&#xff0c;通过复制该原型来返回一个新对象&#xff0c;而不是新建对象&#xff0c;说白了就是不断复制相同的对象罢了。 二、UML类图 三、角色分析 角色描述抽象原型类规定了具体的原型对象必须实现的clone()方法具体原型类实现抽象…

倒计时1天!LeaTech全球CTO领导力峰会TVP四周年庆典即将开幕

引言 3 月 4 日&#xff0c;上海扬子江丽笙精选酒店&#xff0c;LeaTech 全球 CTO 领导力峰会暨腾讯云 TVP 四周年、CTO 训练营校友联合庆典即将开幕。本次 LeaTech 全球 CTO 领导力峰会以“寻光之旅”为主题&#xff0c;腾讯云 TVP 携手 51CTO&#xff0c;联合邀请业内资深领袖…

C# winform界面显示3D点云图像(halcon+VTK)

前一段时间研究了下halcon里的3d算法&#xff0c;想着把3d图像显示在C#编写的软件界面上&#xff0c;试了下halcon的控件&#xff0c;没成功。后来学习了一点VTK的知识&#xff0c;实现了3d图像的显示&#xff0c;可旋转&#xff0c;平移&#xff0c;缩放观察&#xff0c;当然也…

为什么国内做不出好的3A游戏?

个人觉得原因如下&#xff1a; 主要原因&#xff1a; 市场需求和消费观念&#xff1a;国内游戏市场对游戏类型和风格有着自身的特点和需求。一些热门游戏类型&#xff0c;如多人在线游戏、手机游戏等&#xff0c;相对于传统的3A游戏更受国内玩家欢迎。这可能导致国内游戏公司…

QInputDialog 不显示ok或cancel按钮bug

今天遇到一个奇怪问题&#xff0c;就是调用 QInputDialog::getText去获取输入文本&#xff0c;但是无法显示系统ok和cancel按钮&#xff0c;我记得之前是可以的&#xff0c;于是我回退上一个版本是正常&#xff0c;于是对比两个版本代码&#xff0c;发现&#xff0c;自己重写 Q…

【人工智能】贝叶斯网络、概率图模型、全局语义、因果链、朴素贝叶斯模型、枚举推理、变量消元

文章目录 频率学派 vs. 贝叶斯学派贝叶斯学派Probability&#xff08;概率&#xff09;:独立性/条件独立性&#xff1a;Probability Theory&#xff08;概率论&#xff09;:Graphical models &#xff08;概率图模型&#xff09;什么是图模型&#xff08;Graphical Models&…

stm32(定时器和PWM知识点)

一、定时器介绍 软件定时 缺点&#xff1a;不精确、占用CPU资源 void Delay500ms() //11.0592MHz { unsigned char i, j, k; _nop_(); i 4; j 129; k 119; do { do { while (--k); } while (--j); } while (--i); }定时器工作原理&#xff1a; 使用精准的时基&#xff0c…

面试靠微服务扭转局面,知乎夸爆的微服务学习笔记到底有多牛?

我们现在的服务-微服务 我感觉微服务不是一个架构&#xff0c;而是像一个生态&#xff0c;应用与应用之间互相独立&#xff0c;却又彼此依赖。通过 DDD 的模型来设计一个地图&#xff0c;把合适的代码放到合适的地方去。实现微服务涉及的工具太多&#xff0c;以下我采用spring…

Python -- 多任务、进程、线程

文章目录 多任务的介绍多任务的执行方式 进程进程的概念进程的作用进程的使用多进程获取进程编号 进程执行带有参数的任务介绍args参数和kwargs的使用 进程注意点进程之间不共享全局变量主进程会等待所有子进程执行结束再结束 线程介绍概念 线程的作用多线程的使用线程执行有参…

在OpenCV中进行图像预处理

今天&#xff0c;我们进一步深入&#xff0c;并处理在图像处理中常用的形态学操作。形态学操作用于提取区域、边缘、形状等。 什么是形态学操作&#xff1f; 形态学操作是在二值图像上进行的。二值图像可能包含许多不完美之处。特别是由一些简单的阈值操作产生的二值图像&#…

2023-07-10 cmake管理的项目中使用vcpkg管理第三方库

一、安装 从Github上克隆Vcpkg仓库然后执行安装命令即可&#xff1a; git clone https://github.com/microsoft/vcpkg .\vcpkg\bootstrap-vcpkg.bat 安装自己需要的第三方库 .\vcpkg\vcpkg install [packages to install] 更多教学可参考&#xff1a; https://learn.microsoft…

kubenetes手动安装V1.22.4

kubenetes手动安装V1.22.4 1、主节点和工作节点需要的组件 提示&#xff1a;为了方便测试请关闭selinux、关闭防火墙、swap. SELinux防火墙的设置&#xff1a; [rootlocalhost]#getenforce Disabled # 修改/etc/selinux/config文件 vim /etc/selinux/config 将SELINUXenfor…

【python】Excel文件的读取操作

测试用例.xlsx文件内容 利用xlrd模块读取文件 import xlrdfilename 测试用例.xlsx # 读取Excel表文件 wb xlrd.open_workbook(filename) # 读取Excel表中的第一个工作表 sheet wb.sheet_by_index(0) # 读取有内容的表格行数 rows sheet.nrows # 读取有内容的表格列数 cols…

嵌入式系统之ADC采样

嵌入式系统往往会有模拟信号的采集&#xff0c;比如模拟传感器温度、压力、流量、速度、光强等模拟量&#xff0c;经过放大整形滤波电路后送给ADC芯片&#xff0c;将电信号转转变成离散的数字量这个过程称之为AD采样&#xff0c;AD采样应用广泛&#xff0c;普遍遵循采样率3倍于…

ES 知识体系

https://www.easyice.cn/archives/367