MATLAB深度极限学习机

devtools/2025/3/20 17:10:32/

本博客来源于CSDN机器鱼,未同意任何人转载。

参考[1]魏洁.深度极限学习机的研究与应用[D].太原理工大学[2023-10-14].DOI:CNKI:CDMD:2.1016.714596.

目录

0.引言       

1.ELM-AE实现

2.DELM实现

3.主程序

4.结尾


0.引言       

深度极限学习机(DELM)目前主要含两种基本结构:1、利用传统深度学习框架(主要是堆栈自动编码器,或者是深度置信网络)进行数据的深度自适应特征提取,而后将获得的特征输入至极限学习机及其变种中进行分类或回归;2、利用极限学习机与自动编码器相结合,形成极限学习机-自动编码器(ELM-AE),结构如图1所示。原理很简单:

H=f(wx+b), x=H\beta

f是隐含层激活函数;w是输入层权重,随机值;b是隐含层偏置也是随机值,β是我们要求的值,也就是输出层权重,直接利用最小二乘法得到:

\beta =(H^{t}H)^{-1}H^{t}x

图1 极限学习机-自动编码器结构
图1 极限学习机-自动编码器结构

将ELM-AE作为无监督学习的基础单元对输入数据进行贪婪逐层无监督预训练,并保存ELM-AE由最小二乘法获得的输出权值矩阵,然后用这些输出层权重来初始化多层极限学习机(ML-ELM,也称深度极限学习机,Deep extreme leaning machine,DELM),最后结合标签信息对DELM的输出层权重进行学习,结果图2所示。

图2 深度极限学习机结构

具体操作就是先用输入x构建第一个ELM-AE,得到H1与β1,然后输入H1构建第二个ELM-AE,得到H2与β2......,这样就能得到一堆β,构建的多隐含层DELM,DELM的输出就是:

y=\beta_{n}^{-1}\beta_{n-1}^{-1}...\beta_{1}^{-1}wx

最后再次基于最小二乘法反向计算w,就能得到所有的权重。

1.ELM-AE实现

前面提到过ELM-AE就是极限学习机,只不过输入=输出,初始化方式与一般的极限学习机的区别是,权重为正交随机值,其实直接用rand或者randn效果都差不多,效果好不好完全看运气,初始化如下:

function elmae = delmsetup(opts, x)[r,n] = size(x);elmae.sizes = [n, opts.sizes];for u = 1 : numel(elmae.sizes) - 1mu=rand;b=log(1+exp(0.1*rand));if elmae.sizes(u)>=elmae.sizes(u+1)elmae.elmae{u}.IW =orth(mu+b*rand(elmae.sizes(u),elmae.sizes(u+1)));%根据文献 将输入权值赋值到-1,1elseIW =(mu+b*rand(elmae.sizes(u),elmae.sizes(u+1)))';elmae.elmae{u}.IW=orth(IW)';endB = orth(rand(elmae.sizes(u+1),1));BiasMatrix = repmat(B,1,r)';elmae.elmae{u}.b=BiasMatrix;elmae.elmae{u}.beta=rand(elmae.sizes(u+1),elmae.sizes(u));end
end

程序我是一次性建立多个ELM-AE,然后保存在一个结构体里,接着用就是训练代码,加入了正则化参数,使得原来的更新公式,如下,C是提前定义的,对训练结果有影响

\beta =(H^{t}H+1/C)^{-1}H^{t}x

function elmae=ELMAEtrain(elmae,opt,P)
% 极限学习机-自动编码器的训练  输入=输出
%INPUT     N:隐含层节点数
%          P:输入数据
%          lambda:L2正则化系数
%          TF:激活函数种类
%OUTPUT    beta:输出权值
N=size(elmae.IW,2);
tempH = P*elmae.IW+elmae.b;
switch opt.TF  %激活函数case 'sig'H = 1 ./ (1 + exp(-tempH));case 'sin'H = sin(tempH);case 'hardlim'H = hardlim(tempH);
end
elmae.beta = (pinv((H'*H+eye(N)/opt.lambda)')*H')*P;

2.DELM实现

先利用前面训练得到的beta求解倒数第二层隐含层的输出,然后继续最小二乘法计算最后一层的取种

function delm=delmtrain(elmae,opts,P_train,T_train)
% ELM-AE无监督训练
for u = 1 : numel(opts.sizes)u;elmae.elmae{u} = ELMAEtrain(elmae.elmae{u},opts,P_train);delm.elmae{u}=pinv(elmae.elmae{u}.beta);P_train=P_train*delm.elmae{u};
end
% 分类或回归层的监督训练
weight=top_ELMtrain(P_train,T_train,opts);
delm.output=weight;
function [beta]=top_ELMtrain(P,T,opt)
%INPUT    
%          P:输入数据
%          T:输入数据标签
%          lambda:L2正则化系数
%OUTPUT    beta:输出权值
N =size(P,2);
beta = pinv((P'*P+eye(N)/opt.lambda)')*P'*T;end

预测或者推理的时候,就直接用前面依次计算的beta与最后一层的beta求解

function output=delmpredict(delm,P)num_hidden=numel(delm.elmae);
for i=1:num_hiddenP=P*delm.elmae{i};
endoutput=P*delm.output;

3.主程序

%% DELM分类
%% 清空环境
close all;clear;format compact;format short;clc
%%
load data_feature_fft
%原始数据是一行一个样本,因此计算归一化的时候先做转置
[train_x,train_ps]=mapminmax(train_X',-1,1);
test_x=mapminmax('apply',test_X',train_ps);
%我写的delm的输入输出都是一列一个样本,需要对原始数据转换一下
P_train = double(train_x)' ;
P_test  = double(test_x)' ;
T_train = double(train_Y);
T_test  = double(test_Y);%% 参数设置
opts.lambda=inf;%正则化系数,无穷就是不用正则化
opts.TF='sig';%激活函数
opts.sizes=[30 20];%几个数就是几个隐含层,n个隐含层各自的节点就是[n1;n2;n3;n4;....nn]
%% 初始化网络权重
elmae=delmsetup(opts,P_train);
%% 训练
delm=delmtrain(elmae,opts,P_train,T_train);
%% 测试;
T2=delmpredict(delm,P_test);
%% 正确率计算
[~,J1]=max(T2,[],2);%预测标签
[~,J2]=max(T_test,[],2);%实际标签
accuracy=sum(J1==J2)/length(J1)
figure
stem(J1)
hold on
plot(J2,'*')
legend('预测标签','真实标签')

 这个代码即可用来预测,也可用来分类,分类的时候输出值就是onehot编码,比如一共3类,第一类的标签是1 0 0,第二类的标签是0 1 0;用作回归的时候,就是具体的值。

4.结尾

由于各个elm-ae的权重都是随机生成的,效果直接影响最后的准确性,下一章我们来讲解怎么操作利用优化算法来优化权重


http://www.ppmy.cn/devtools/168675.html

相关文章

【数据分享】1999—2023年地级市固定资产投资和对外经济贸易数据(Shp/Excel格式)

在之前的文章中,我们分享过基于2000-2024年《中国城市统计年鉴》整理的1999-2023年地级市的人口相关数据、染物排放和环境治理相关数据、房地产投资情况和商品房销售面积相关指标数据、社会消费品零售总额和年末金融机构存贷款余额、各类用地面积、地方一般公共预算…

PySide(PyQt),使用types.MethodType动态定义事件

以PySide(PyQt)的图片项为例,比如一个视窗的场景底图是一个QGraphicsPixmapItem,需要修改它的鼠标滚轮事件,以实现鼠标滚轮缩放显示的功能。为了达到这个目的,可以重新定义一个QGraphicsPixmapItem类,并重写它的wheelE…

10、基于osg引擎生成热力图高度图实现3D热力图可视化、3D热力图实时更新(带过渡效果)

1、结果 2、完整C代码 #include <sstream> #include <iomanip> #include <iostream> #include <vector> #include <random> #include <cmath> #include <functional> #include <osgViewer/viewer> #include <osgDB/Read…

python3+pytest+allure自动化框架搭建

博主之前的工作中使用过Pythonrobotframework框架进行接口自动化和webUI自动化&#xff0c;现在按照自己的过往经验&#xff0c;搭建pythonpytestallure的接口自动化框架。 很多人会python、requests、json等库去发送请求并处理请求&#xff0c;但是有些人还是不知道接口自动化…

【网络协议】基于UDP的可靠协议:KCP

TCP是为流量设计的&#xff08;每秒内可以传输多少KB的数据&#xff09;&#xff0c;讲究的是充分利用带宽。而 KCP是为流速设计的&#xff08;单个数据包从一端发送到一端需要多少时间&#xff09;&#xff0c;以10%-20%带宽浪费的代价换取了比 TCP快30%-40%的传输速度。TCP信…

Python基于深度学习的多模态人脸情绪识别研究与实现

一、系统架构设计 A[数据采集] --> B[预处理模块] B --> C[特征提取] C --> D[多模态融合] D --> E[情绪分类] E --> F[系统部署] F --> G[用户界面] 二、数据准备与处理 1. 数据收集 - 视频数据&#xff1a;FER2013&#xff08;静态图像&#xff0…

【虚幻C++笔记】打印输出的方式

目录 UE_LOGGEngine->AddOnScreenDebugMessage UE_LOG UE_LOG 宏是UnrealEngine 中用于日志记录的标准方式。它可以输出日志信息到控制台和日志文件&#xff0c;支持多种日志级别&#xff08;如Log&#xff0c;Warning&#xff0c;Error") UE_LOG(LogCategory, LogVer…

MongoDB 更新集合名

MongoDB 更新集合名 引言 在MongoDB中&#xff0c;集合&#xff08;Collection&#xff09;是存储数据的基本单位。在实际应用中&#xff0c;我们可能会因为各种原因需要更改集合的名称。本文将详细介绍如何在MongoDB中更新集合名&#xff0c;并探讨一些相关的注意事项。 更…