极限学习机(Extreme Learning Machine, ELM)原理详解和MATLAB实现

2023-05-16

目录

引言

极限学习机原理

MATLAB中重点函数解读

极限学习机的MATLAB实践


引言

极限学习机不是一个新的东西,只是在算法(方法)上有新的内容。在神经网络结构上,就是一个前向传播的神经网络,和之前几篇博文讲的意义。

为什么我们需要ELM?

The learning speed of feedforward neural networks is in general far slower than required and it has been a major bottleneck in their applications for past decades. Two key reasons behind may be:

1) the slow gradient-based learning algorithms are extensively used to train neural networks.

2) all the parameters of the networks are tuned iteratively by using such learning algorithms.

最大的创新点:

1)输入层和隐含层的连接权值、隐含层的阈值可以随机设定,且设定完后不用再调整。这和BP神经网络不一样,BP需要不断反向去调整权值和阈值。因此这里就能减少一半的运算量了。

2)隐含层和输出层之间的连接权值β不需要迭代调整,而是通过解方程组方式一次性确定

研究表明,通过这样的规则,模型的泛化性能很好,速度提高了不少。

一言概之,ELM最大的特点就是对于传统的神经网络,尤其是单隐层前馈神经网络(SLFNs),在保证学习精度的前提下比传统的学习算法速度更快。

Compared BP Algorithm and SVM,ELM has several salient features:

Ease of use. No parameters need to be manually tuned except predefined network architecture.只有隐含层神经元个数需要我们调整。

Faster learning speed. Most training can be completed in milliseconds, seconds, and minutes.

Higher generalization performance. It could obtain better generalization performance than BP in most cases, and reach generalization performance similar to or better than SVM.(泛化能力提升)

Suitable for almost all nonlinear activation functions.Almost all piecewise continuous (including discontinuous, differential, non-differential functions) can be used as activation functions.

Suitable for fully complex activation functions. Fully complex functions can also be used as activation functions in ELM.

极限学习机原理

ELM是一种新型的快速学习算法,对于单隐层神经网络,ELM可以随机初始化输入权重和偏置并得到相应的输出权重。

对于一个单隐层神经网络(见上面的图),假设有个任意的样本,其中。对于一个有个隐层节点的单隐层神经网络可以表示为

其中,为激活函数,为输入权重,为输出权重,是第个隐层单元的偏置。表示的内积。

单隐层神经网络学习的目标是使得输出的误差最小,可以表示为

即存在,使得

可以矩阵表示为

其中,是隐层节点的输出,为输出权重,为期望输出。

为了能够训练单隐层神经网络,我们希望得到,使得

其中,,这等价于最小化损失函数

传统的一些基于梯度下降法的算法,可以用来求解这样的问题,但是基本的基于梯度的学习算法需要在迭代的过程中调整所有参数。而在ELM算法中, 一旦输入权重和隐层的偏置被随机确定,隐层的输出矩阵就被唯一确定。训练单隐层神经网络可以转化为求解一个线性系统。并且输出权重可以被确定

其中,是矩阵的Moore-Penrose广义逆。且可证明求得的解的范数是最小的并且唯一。

上面涉及到矩阵论的一些知识,其实也不需要理解,只要百度一下相关的概念,比如广义逆怎么求,或直接matlab里面去算就好了。对于偏工程应用的人而言,此处不需要多费时间了解数学原理。

ELM的作者,黄广斌老师提供的代码:http://www.ntu.edu.sg/home/egbhuang/elm_codes.html

参考博文:https://blog.csdn.net/google19890102/article/details/18222103?utm_source=copy

MATLAB中重点函数解读

下面我们打算用MATLAB来实现以下ELM。使用到的不是作者的代码,而是网络上的高手前辈们自己写的代码。

  • nargin:n arg in:自动计算出方法输入了几个参数

  • error:给出错误信息

  • pinv:求伪逆矩阵

  • sin / hardlim:涉及到激活函数

  • elmtrain 自己写的函数,用于ELM训练,记住:每一列代表一个样本

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';
  • elmpredict   自己写的函数

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)
        [~,index] = max(Y(:,i));
        temp_Y(index,i) = 1;
    end
    Y = vec2ind(temp_Y); 
end
       
    

极限学习机的MATLAB实践

【实例1】汽油辛烷值预测

%% I. 清空环境变量
clear all
clc

%% II. 训练集/测试集产生
%%
% 1. 导入数据
load spectra_data.mat

%%
% 2. 随机产生训练集和测试集
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);

%% III. 数据归一化
%%
% 1. 训练集
[Pn_train,inputps] = mapminmax(P_train);
Pn_test = mapminmax('apply',P_test,inputps);
%%
% 2. 测试集
[Tn_train,outputps] = mapminmax(T_train);
Tn_test = mapminmax('apply',T_test,outputps);

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

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

%% VI. 结果对比
result = [T_test' T_sim'];
%%
% 1. 均方误差
E = mse(T_sim - T_test);

%%
% 2. 决定系数
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)); 

%% VII. 绘图
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)

【实例2】鸢尾花侯种类识别

%% I. 清空环境变量
clear all
clc

%% II. 训练集/测试集产生
%%
% 1. 导入数据
load iris_data.mat

%%
% 2. 随机产生训练集和测试集
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

%% III. ELM创建/训练
[IW,B,LW,TF,TYPE] = elmtrain(P_train,T_train,20,'sig',1);

%% IV. ELM仿真测试
T_sim_1 = elmpredict(P_train,IW,B,LW,TF,TYPE);
T_sim_2 = elmpredict(P_test,IW,B,LW,TF,TYPE);

%% V. 结果对比
result_1 = [T_train' T_sim_1'];
result_2 = [T_test' T_sim_2'];
%%
% 1. 训练集正确率
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) ')'])

%%
% 2. 测试集正确率
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) ')'])

%% VI. 绘图
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预测值')

数据集放在:链接:https://pan.baidu.com/s/1wqVzwcL1xQ_Uh50XoYqyrw 密码:5wq2

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

极限学习机(Extreme Learning Machine, ELM)原理详解和MATLAB实现 的相关文章

  • MySQL集群架构

    第1节 集群架构设计 在集群架构设计时 xff0c 主要遵从下面三个维度 xff1a 可用性 扩展性 一致性 1 1 可用性设计 站点高可用 xff0c 冗余站点 xff1b 服务高可用 xff0c 冗余服务 xff1b 数据高可用 xff
  • CF 1008D Pave the Parallelepiped

    传送门题目大意 样例输入样例输出样例解释 思路参考代码总结 传送门 题目大意 给你一个 A B C A B C 的长方体 xff0c 你要把它切成很多块大小都是 a b c
  • Direct2D 学习笔记

    文章目录 Direct2DD2D 是什么D2D 适合谁开发环境发布平台入门我能找到例子吗一 第一个 D2D 程序 Hello Direct2D1 工厂2 呈现器3 渲染4 运行结果 二 Direct2D 画图实践 Random Graphi
  • Python 学习笔记——入门

    文章目录 Python 是什么一 推荐的教程二 这篇学习笔记适合什么人三 环境1 操作系统对于 Windows对于 Ubuntu对于其他操作系统 2 Python对于 Windows安装步骤1 下载2 安装 测试是否成功安装退出 Pytho
  • CF 1166A Silent Classroom

    文章目录 传送门题目大意思路别人的思路参考代码Python 学习笔记 传送门 题目大意 有 n n 100
  • SHGetKnownFolderPath function

    原文 SHGetKnownFolderPath 通过一个 KNOWNFOLDERID 标志获取对应已知文件夹的完整路径 Retrieves the full path of a known folder identified by the
  • WM_DPICHANGED message

    原文 WM DPICHANGED message 当窗口的 DPI 改变时将收到此消息 DPI 是窗口的缩放比例 有多种情况会导致 DPI 改变 xff0c 如下表列出 xff1a 窗口被移动到有不同 DPI 的显示器 窗口所在显示器的 D
  • WSL运行python程序关于路径的坑

    安装了wsl xff08 Windows下的Linux子系统 xff09 xff0c 跑python代码时 xff0c 发现路径有问题 总结来说 xff0c 如果是跑linux里的代码 xff0c 那么其中的绝对路径就按linux的地址解析
  • 【基础编程题】Java基础====键盘输入学生成绩,计算后按总分高低顺序存入磁盘文件txt

    要求 xff1a 有五个学生 xff0c 每个学生有3门课程的成绩从键盘输入以上数据 xff08 包括姓名 xff0c 三门课成绩 xff09 输入的格式 xff1a 如 xff1a zhangsan 30 40 60计算出总成绩 xff0
  • MySQL 配置文件位置及命名。

    MySQL 配置文件位置及命名 使用 mysqladmin 或 mysql xff0c 会提示 MySQL 加载配置文件的顺序及文件命名规范 span class token keyword Default span options are
  • Codeforces 1419B. Stairs 递归

    Codeforces 1419B Stairs 递归 原题链接https codeforces com problemset problem 1419 B 样例 输入 5 2 1 49 5 20 50 6 20 50 5 3 8 9 13
  • dos中定义变量与引用变量以及四则运算

    在dos中使用set定义变量 xff1a set a 61 8 注意等号两边没有空格 引用变量如 xff1a echo a 将打印a的值 dos中要使用算术运算 xff0c 需要使用 set 命令 xff1a set a val 61 3
  • Python将计算结果拷贝至粘贴板

    前言 xff1a 我们知道在使用ctrl 43 c复制文字时 xff0c 实际是将文字复制到了粘贴板中 xff08 内存 xff09 xff0c 而在实际应用中 xff0c 除了将Python的计算结果打印外 xff0c 有时还想进行自动复
  • Java反射——通过Java反射机制设置属性值

    本示例使用Java反射机制分别设置当前类的private public属性以及其父类的private属性来说明如何通过Java反射机制设置属性值 xff08 注 xff1a 设置继承的父类属性时 xff0c 无法通过当前类的Class对象直
  • 7-9 选择法排序之过程 (15 分)

    7 9 选择法排序之过程 15 分 本题要求使用选择法排序 xff0c 将给定的n个整数从小到大排序后输出 xff0c 并输出排序过程中每一步的中间结果 选择排序的算法步骤如下 xff1a 第0步 xff1a 在未排序的n个数 xff08
  • Debian配置清华源

    确定debian的系统版本 plc 64 debian cat etc os release PRETTY NAME 61 34 Debian GNU Linux 9 stretch 34 NAME 61 34 Debian GNU Lin
  • AAC音频编码格式介绍

    一 概述及分类 AAC Advanced Audio Coding 的缩写 xff0c 中文称为 高级音频编码 xff0c 被手机界称为 21世纪数据压缩方式 xff0c AAC所采用的运算方式是与MP3的运算有所不同 xff0c AAC同
  • Ubuntu系统失败之----安装U盘不能存放其它文件

    Ubuntu安装失败的经验贴 背景 xff1a 笔者在数月之前制作了一个Ubuntu 14 4系统安装盘 xff08 当时把U盘格式化 制作了引导并且拷贝了镜像 xff09 U盘的特点是除了系统相关文件之外没有其它任何文件 当时在三台联想笔
  • 结构体sizeof不想字节对齐

    问题描述 xff1a 笔者在做一个项目 xff1a 硬件要访问内存中按照Spec格式定义 的一段数据包 在C语言中一般使用结构体初始化这个数据包 xff0c 因为可以方便配置各个字段 但结构体默认需要字节对齐的 xff08 sizeof和实
  • C/C++语言static修饰函数的作用

    描述 xff1a 在C C 43 43 语言程序中 xff0c 特别是的大型程序 xff0c 函数名前往往用static关键词修饰 作用 xff1a 主要的作用是避免命名冲突 static函数与一般函数作用域不同 xff0c 仅在本文件有效

随机推荐

  • ubuntu16.04升级18.04(再次作死)

    继上次升级glibc版本作了一次大死后 xff0c 手又痒了 xff0c 又觉得我可以了 来继续升级ubuntu16 04升级到 ubuntu18 04 最主要的原因是ubuntu自带的python只到了3 5的版本 而我需要python3
  • 初始C语言——统计字符串中的字母,数字和其他符号 的个数

    define CRT SECURE NO WARNINGS 1 防止visual studio2013以上版本scanf报错 xff0c vc6 0环境可忽略 include lt stdio h gt int main int a 61
  • Linux下开发调试中大型C语言代码-如何提高效率

    背景 xff1a 在Linux下开发中大型C语言程序 xff08 包括编写 编译调试等步骤 xff09 时 xff0c 尤其大部分代码都是原创的情况下 以下的经验往往能提高调试效率 经验 xff1a xff08 1 xff09 Linux命
  • 《C语言中分配了动态内存后一定要释放吗?》

    问 xff1a 比如main函数里有一句 malloc 后面没有free 1 那么当main结束后 xff0c 动态分配的内存不会随之释放吗 xff1f 2 如果程序结束能自动释放 xff0c 那么还加上free xff08 xff09 x
  • Qemu使用心得

    使用Qemu的心得体会如下 xff1a xff08 1 xff09 在QEMU源码中增加自己的 c实现 xff0c 编译后出现很多个错误如 xff1a error storage class specified for parameter
  • 转载:malloc和free底层实现

    转载 xff1a malloc和free底层实现 内存管理内幕 Linux内存管理 xff1a Malloc 本文引用了下面这篇文章 xff0c 读完下面 xff0c 应该读下上面两篇文章 xff0c 其中 xff0c 内存管理内幕 提供了
  • qemu tcg代码执行流程

    转自 xff1a http blog csdn net alloc7 article details 7719823 一 qemu简介 qemu是使用动态二进制翻译的cpu模拟器 xff0c 它支持两种运行模式 xff1a 全系统模拟和用户
  • c语言如何调用c++(本文从qemu开发中总结)

    背景 xff1a 有时候一个工程中有c语言编写的代码 c xff0c 也有c 43 43 cpp 编写的 xff0c 分别用 xff43 语言编译器 xff08 这里指 xff47 xff43 xff43 xff09 和 xff43 xff
  • c++常错语法

    1 new T 代表创建一个T类的对象指针 xff0c new T 标识创建T类对象数组指针 2 template模板类只能把成员函数都定义在 h中 xff0c 分开 h和 cpp会报链接错误 3 类A 的成员变量包含B的对象B b xff
  • UEFI EDK2开发环境设置关键点/修改环境变量

    1 问题描述 Linux下当修改了已经编译过的EDK2工程顶层路径后 进入工程顶层路径source edksetup sh会报错 2 解决步骤 有一个隐藏问题非常容易被忽视 那就是EDK2工程的环境变量可能还是原来的旧的 这时候 1 进入工
  • linux静态库.a使用常见错误

    在linux中如果一个程序需要用到 a 有以下几点需要注意 1 如果x o与y o中用到了静态xx a中的函数 不能用gcc xx a o test x o y o这种方式编译 会提示那些函数undefined 正确的做法是gcc o te
  • C/C++多线程常见问题

    1 问题 1 1 创建线程后是否立马开始并行执行 答 主线程创建了子线程之后 后者并不是立即就开始运行了 至少在Linux操作系统下 1 子线程和主线程运行在一个core上 那还需要等待主线程交出core控制权 可能是时间片耗尽 2 子线程
  • 2020 年百度之星·程序设计大赛 - 初赛二 题解

    废话 丑话说在前头 xff0c T8我不会 xff08 没错是指我会出丑 xff09 T1 既然要玩尽可能多轮 xff0c 那么每轮投入的钱就要最少 xff0c 也就是 m m m 元 xff0c 那么可以算出每轮游戏会亏损
  • QEMU内存管理

    QEMU内存管理 1 QEMU中管理的Memory有 xff1a 普通的RAM MMIO 内存控制器 将物理内存动态的映射到不同的虚拟地址空间 2 QEMU的Memory是以一个MemoryRegin为节点组成的非循环图的形式组织的 叶子节
  • Matlab实现基于二维伽马函数的光照不均匀图像自适应校正算法

    Matlab程序 xff1a 基于二维伽马函数的光照不均匀图像自适应校正算法 clc close all tic im 61 imread 39 你的图片 jpg 39 figure imshow im title 39 原图 39 h s
  • SCI回复评审意见模板

    一般反馈回来修改时 xff0c 要给编辑重新写一封cover letter xff0c 表示尊重与感谢 xff0c 范文如下 句式大家可以依照自己的习惯表达修改 xff0c 多参考他人经验 xff09 Dear XX xff08 给你回信的
  • 毕业快乐 —— 写于2020年3月13日

    很久没有经营这个博客了 今天来写点什么罢 2020的春天 xff0c 由于猝不及防的疫情 xff0c 参加了一场特殊的毕业答辩 线上答辩形式 没有西装和鲜花 xff0c 似乎缺少了一些仪式感 但毕业似乎真真切切就是一件水到渠成的事情 xff
  • Mac连上WIFI但是无法上网的3种解决方案

    一般我们最先会认为是DNS问题 xff0c 你可以试下用ip访问一个服务器 xff08 网站 xff09 看下行不行 xff0c 如果也不行那就应该不是DNS的问题了 或者改变一下DNS xff0c 如114 xff0c 或者自己内网要求的
  • 简单粗暴理解支持向量机(SVM)及其MATLAB实例

    目录 SVM概述 SVM的改进 xff1a 解决回归拟合问题的SVR 多分类的SVM QP求解 SVM的MATLAB实现 xff1a Libsvm 实例 用SVM分类 实例 用SVM回归 SVM概述 SVM已经是非常流行 大家都有所耳闻的技
  • 极限学习机(Extreme Learning Machine, ELM)原理详解和MATLAB实现

    目录 引言 极限学习机原理 MATLAB中重点函数解读 极限学习机的MATLAB实践 引言 极限学习机不是一个新的东西 xff0c 只是在算法 xff08 方法 xff09 上有新的内容 在神经网络结构上 xff0c 就是一个前向传播的神经