1-1 MATLAB深度极限学习机

news2025/3/23 7:28:56

本博客来源于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) - 1
        mu=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,1
        else
            IW =(mu+b*rand(elmae.sizes(u),elmae.sizes(u+1)))';
            elmae.elmae{u}.IW=orth(IW)';
        end
        B = 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_hidden
    P=P*delm.elmae{i};
end

output=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.coloradmin.cn/o/2318782.html

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

相关文章

MyBatis源码分析のSql执行流程

文章目录 前言一、准备工作1.1、newExecutor 二、执行Sql2.1、getMappedStatement2.2、query 三、Cache装饰器的执行时机四、补充总结 前言 本篇主要介绍MyBatis解析配置文件完成后,执行sql的相关逻辑: public class Main {public static void main(Str…

Java 大视界 -- Java 大数据中的知识图谱可视化与交互分析技术(141)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

万字长文详解|蚂蚁数据湖深度探索与业务应用实践

作者介绍:黄超傑,蚂蚁数据智能部实时数据团队数据研发工程师,致力于数据湖技术在蚂蚁落地应用、蚂蚁广告实时数仓建设、蚂蚁数据成本治理等工作。 在开始之前 如果: 你想要提升数据时效,能够接受分钟级延迟你好奇准实…

网络空间安全(36)数据库权限提升获取webshell思路总结

一、获取数据库访问权限 寻找漏洞: SQL注入:这是最常见的方法之一。攻击者通过SQL注入漏洞,可以在数据库执行任意SQL语句,从而获取数据库中的数据,甚至可能获取数据库的访问权限。配置文件泄露:有时&#x…

火山引擎(豆包大模型)(抖音平台)之火山方舟的Prompt的使用测试

前言 在大模型的使用过程当中,Prompt的使用非常的关键。原来,我对Prompt的理解不深,觉得Prompt的产生并不是很有必要。但是,自从使用了火山方舟中的“Prompt优解”之后,感受加深了,觉得Prompt是我们和大模型…

AI助力临床诊疗:AI工具帮助确认病情

在临床诊疗中,准确确认病情是治疗成功的关键。然而,传统的诊疗方法往往依赖医生的经验和有限的检查手段,容易出现误诊或漏诊的情况。随着人工智能(AI)技术的飞速发展,AI工具在临床诊疗中的应用逐渐崭露头角…

【平台优化】大数据集群一个客户端参数引起的任务性能差的问题

大数据集群一个客户端参数引起的任务性能差的问题 背景介绍排查过程任务慢的具体原因Executor中数据内存往磁盘溢写结果数据写入分区路径 分析解决方案 结语&思考 背景介绍 随着业务量不断扩大,平台逐步发展成HDFS多联邦的架构,这个过程中&#xff…

【OCR】总结github上开源 OCR 工具:让文字识别更简单

前言 在数字化的时代,光学字符识别(OCR)技术成为了我们处理文档、图像文字信息的得力助手。它能够将图像中的文字信息转换为可编辑和可处理的文本数据,极大地提高了信息处理的效率。今天,我要给大家介绍一些优秀的开源…

Jmeter使用之http请求默认值

一、添加【HTTP请求默认值】 1、添加方式 【线程组】---->右击【添加】---->【配置元件】---->【HTTP请求默认值】 2、作用 在发送http请求的时候,自带默认值设置的参数(常用:【协议】、【服务器名称或IP】、端口号、内容编码&…

【QT】】qcustomplot的初步使用二

功能预期: 在简单显示曲线()基础上加功能: 1.在曲线区域里,X轴可以随鼠标滚轮变化将图像缩放、随鼠标左键进行曲线移动; 2.在曲线区域里,Y轴的量程可以随Y轴数据大小自适应; 3.可以…

让 Google Play 成为助力 PC 游戏增长的最佳平台

作者 / Google Play 游戏副总裁兼总经理 Aurash Mahbod 我们正在加强多平台游戏产品,并将在今年的游戏开发者大会 (GDC) 上发布激动人心的消息。我们将为用户带来更多游戏,提供更多跨设备畅玩游戏的方式,并进一步优化游戏体验。在游戏开发者大…

路径问题(greedy):地下城游戏

题目描述: 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健…

electron框架(3.0)主程序与桥梁与渲染,以及之间的通信

每个页面程序通过渲染和主进程通信,主进程根据需求调用Native Api来实现功能。 实际,每个页面和主程序通信时,需要建个桥梁来管理它们的通信,preload.js(自己创建),来管理实现通信。 ----创建preload.js定义桥梁js&a…

JS—原型与原型链:2分钟掌握原型链

个人博客:haichenyi.com。感谢关注 一. 目录 一–目录二–原型三–原型链 二. 原型 什么是原型? 每个JavaScript对象都有一个原型,这个原型也是一个对象。比方说 function Person(name) {this.name name; } let person new Person(&quo…

Canal 解析与 Spring Boot 整合实战

一、Canal 简介 1.1 Canal 是什么? Canal 是阿里巴巴开源的一款基于 MySQL 数据库增量日志解析(Binlog)中间件,它模拟 MySQL 的从机(Slave)行为,监听 MySQL 主机的二进制日志(Binl…

图论——Prim算法

53. 寻宝(第七期模拟笔试) 题目描述 在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。 不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将 所有岛屿联通…

1. 初识golang微服务-gRPC

单体架构 在这里插入图片描述 微服务架构 RPC架构(远程过程调用) 服务端实例代码: package mainimport ("fmt""net""net/rpc""time" )type Hello struct { }func (h Hello) SayHello(req stri…

视频翻译器免费哪个好?轻松玩转视频直播翻译

你是不是觉得看外语视频很麻烦?每次遇到喜欢的外语电影、电视剧或动漫,总是要等字幕组的翻译,或者因为语言不通而错过精彩的情节。 这个时候,掌握多语种直播翻译方案就显得尤为重要,有了实时字幕,看外语视…

Python列表1

# coding:utf-8 print("———————————— 列表 ——————————————")列表 是指一系列按照特定顺序排列的元素组成 是Python中内置的可变序列 使用[]定义列表,元素与元素之间使用英文的逗号分隔 列表中的元素可以是任意的数据类型列表的…

3.19学习总结

学习了Java中的面向对象的知识点 完成一道算法题,找树左下角的值,错误的以为左下角只能是最底层的左节点,但指的是最底层最左边的节点