1-4 麻雀优化深度核极限学习机超参数

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

更多内容,欢迎点击本专栏目录,查看更多内容。

目录

0.引言

1.原理

2.具体实现

3.结语


0.引言


在博客【深度核极限学习机】里我们讲述了深度核极限学习机原理,今天我们对其继续进行改进:观察下列DKELM的调用代码可以发现,超参数有隐含层节点数、ELM-AE的L2正则化系数,核函数的惩罚系数与核参数等,这些参数都直接影响分类或回归的准确率,做过SVM的都知道,光惩罚系数与核参数的选择都很困难,一般也不是自己手动选择,都是用各种优化智能优化算法进行手动选择,因此我们继续利用优化算法进行优化选择。

%elm-ae的参数
h=[100 ,50];%各隐含层节点数,里面有几个数就是几个隐含层,即有几个ELM-AE参与无监督预训练,数字代表隐含层节点数
% 比如 h=[100,50],假如输入是200,输出是5类,则DKELM网络结构为200-100-50-5。
% 比如 h=[100,50,20],假如输入是200,输出是5类,则DKELM网络结构为200-100-50-20-5。
TF='sig';%ELM-AE激活函数
lambda=1000;%ELM-AEL2正则化系数
%顶层核极限学习的惩罚系数与核参数
kernel='RBF_kernel';%核函数类型  RBF_kernel lin_kernel poly_kernel wav_kernel
% kernelpara中第一个参数是惩罚系数
if strcmp(kernel,'RBF_kernel')kernelpara=[1 1]; %rbf有一个核参数
elseif strcmp(kernel,'lin_kernel')kernelpara=[1]; %线性没有核参数
elseif strcmp(kernel,'poly_kernel')kernelpara=[1,1,1]; %多项式有2个核参数
elseif strcmp(kernel,'wav_kernel')kernelpara=[1,1,1,1]; %小波核有3个核参数
end
%%
delm=dkelmtrain(P_train,T_train,h,lambda,TF,kernelpara,kernel);
T1=dkelmpredict(delm,kernelpara,kernel,P_train,P_train);

1.原理

麻雀优化算法的原理到处都是,就不详细说明了。我们只需要知道一点,任何一个优化算法,都是在他的寻优空间内,基于特定公式进行寻优,具体什么公式我们可以不用管,只要网上能找到可以跑得通的原始代码,我们拿过来改一下就能用,我要调整的就是寻优参数的维度,每个参数的寻优范围,以及适应度函数。

具体实现如下:

2.具体实现

步骤1:确定寻优参数与寻优的范围。如下代码所示,我们要优化的是各隐含层节点数,ELM-AE的正则化系数,顶层kelm的惩罚系数与核参数,隐含层数量与核函数类型是预先设定好的,一般设置成3层与RBF核函数即可。由于每个参数的代码的含义不一样,因此我们需要针对每个参数设定寻优范围lb与ub,详细的看下列代码。

function [bestX,Convergence_curve,result]=ssafordkelm(P_train,P_test,T_train,T_test,layers,TF,kernel)
% 优化DKELM超参数,包括各隐含层节点数,正则化系数,顶层kelm的惩罚系数与核参数
% 定义寻优边界,由于隐含层层数与核函数类型会影响寻优维度,所以下面我们分段进行寻优范围设置
lb=[];ub=[];
% 首先是各层节点数,范围是1-100,整数
lb=[lb ones(1,layers)];
ub=[ub 100*ones(1,layers)];
% 然后是ELM-AE的正则化系数与 kelm的惩罚系数
lb=[lb 1e-3 1e-3];
ub=[ub 1e3  1e3];
% 最后是kelm的核参数
% 核参数设置  详情看kernel_matrix
if strcmp(kernel,'RBF_kernel')lb=[lb 1e-3];ub=[ub 1e3 ]; %rbf有一个核参数
elseif strcmp(kernel,'lin_kernel')lb=[lb];ub=[ub]; %线性没有核参数
elseif strcmp(kernel,'poly_kernel')lb=[lb 1e-3 1];ub=[ub 1e3 10];  %多项式有2个核参数,第二个是多项式幂指数,我们把范围就定到1-10
elseif strcmp(kernel,'wav_kernel')lb=[lb 1e-3 1e-3 1e-3];ub=[ub 1e3 1e3 1e3]; %小波核有3个核参数
end
dim=length(lb);pop=10; % 种群数
M=10; % Maximum numbef of iterationsP_percent = 0.2;    % The population size of producers accounts for "P_percent" percent of the total population size
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
pNum = round( pop *  P_percent );    % The population size of the producers%Initialization
for i=1:pop%随机初始化位置for j=1:dimif j>layers% % 隐含层节点是整数 其他的都是浮点数x(i,j)=(ub(j)-lb(j))*rand+lb(j);elsex(i,j)=round((ub(j)-lb(j))*rand+lb(j));  %endendfit(i)=fitness(x(i,:),P_train,T_train,P_test,T_test,layers,TF,kernel);
endpFit = fit;
pX = x; 
fMin=fit(1);
bestX = x( i, : );
result=[];
for t = 1 : Mt[ ans, sortIndex ] = sort( pFit );% Sort.从小到大[fmax,B]=max( pFit );worse= x(B,:);r2=rand(1);%%%%%%%%%%%%%5%%%%%%这一部位为发现者(探索者)的位置更新%%%%%%%%%%%%%%%%%%%%%%%%%if(r2<0.8)%预警值较小,说明没有捕食者出现for i = 1 : pNum  %r2小于0.8的发现者的改变(1-20)                                                 % Equation (3)r1=rand(1);x( sortIndex( i ), : ) = pX( sortIndex( i ), : )*exp(-(i)/(r1*M));%对自变量做一个随机变换x( sortIndex( i ), : ) = Bounds( x( sortIndex( i ), : ), lb, ub,layers );%对超过边界的变量进行去除fit(  sortIndex( i ) )=fitness(x( sortIndex( i ), : ),P_train,T_train,P_test,T_test,layers,TF,kernel);endelse   %预警值较大,说明有捕食者出现威胁到了种群的安全,需要去其它地方觅食for i = 1 : pNum   %r2大于0.8的发现者的改变x( sortIndex( i ), : ) = pX( sortIndex( i ), : )+randn(1)*ones(1,dim);x( sortIndex( i ), : ) = Bounds( x( sortIndex( i ), : ), lb, ub,layers );fit(  sortIndex( i ) )= fitness(x( sortIndex( i ), : ),P_train,T_train,P_test,T_test,layers,TF,kernel);endend[ fMMin, bestII ] = min( fit );bestXX = x( bestII, : );%%%%%%%%%%%%%5%%%%%%这一部位为加入者(追随者)的位置更新%%%%%%%%%%%%%%%%%%%%%%%%%for i = ( pNum + 1 ) : pop     %剩下20-100的个体的变换                % Equation (4)
%         i
%         sortIndex( i )A=floor(rand(1,dim)*2)*2-1;if( i>(pop/2))%这个代表这部分麻雀处于十分饥饿的状态(因为它们的能量很低,也是是适应度值很差),需要到其它地方觅食x( sortIndex(i ), : )=randn(1,dim).*exp((worse-pX( sortIndex( i ), : ))/(i)^2);else%这一部分追随者是围绕最好的发现者周围进行觅食,其间也有可能发生食物的争夺,使其自己变成生产者x( sortIndex( i ), : )=bestXX+(abs(( pX( sortIndex( i ), : )-bestXX)))*(A'*(A*A')^(-1))*ones(1,dim);endx( sortIndex( i ), : ) = Bounds( x( sortIndex( i ), : ), lb, ub,layers );%判断边界是否超出fit(  sortIndex( i ) )=fitness(x( sortIndex( i ), : ),P_train,T_train,P_test,T_test,layers,TF,kernel);end%%%%%%%%%%%%%5%%%%%%这一部位为意识到危险(注意这里只是意识到了危险,不代表出现了真正的捕食者)的麻雀的位置更新%%%%%%%%%%%%%%%%%%%%%%%%%c=randperm(numel(sortIndex));%%%%%%%%%这个的作用是在种群中随机产生其位置(也就是这部分的麻雀位置一开始是随机的,意识到危险了要进行位置移动,%处于种群外围的麻雀向安全区域靠拢,处在种群中心的麻雀则随机行走以靠近别的麻雀)b=sortIndex(c(1:3));for j =  1  : length(b)      % Equation (5)if( pFit( sortIndex( b(j) ) )>(fMin) ) %处于种群外围的麻雀的位置改变x( sortIndex( b(j) ), : )=bestX+(randn(1,dim)).*(abs(( pX( sortIndex( b(j) ), : ) -bestX)));else   %处于种群中心的麻雀的位置改变x( sortIndex( b(j) ), : ) =pX( sortIndex( b(j) ), : )+(2*rand(1)-1)*(abs(pX( sortIndex( b(j) ), : )-worse))/ ( pFit( sortIndex( b(j) ) )-fmax+1e-50);endx( sortIndex(b(j) ), : ) = Bounds( x( sortIndex(b(j) ), : ), lb, ub,layers );fit(  sortIndex( b(j)  ) )=fitness(x( sortIndex( b(j) ), : ),P_train,T_train,P_test,T_test,layers,TF,kernel);endfor i = 1 : popif ( fit( i ) < pFit( i ) )pFit( i ) = fit( i );pX( i, : ) = x( i, : );endif( pFit( i ) < fMin )fMin= pFit( i );bestX = pX( i, : );endendConvergence_curve(t)=fMin;result(t,:)=bestX;
end

步骤2:确定适应度函数。观察ssafordkelm函数中更新fmin与bestX可知,这个优化算法是找适应度函数最小时对应的x值,是一个最小化问题,因此我们的适应度函数也要写成最小化误差的方式。代码如下,首先将麻雀的x传进来,进行解码,得到各隐含层节点数、L2正则化系数、顶层kelm的惩罚系数与核参数,然后用这些参数训练、预测DELM,得到预测值,分类任务就计算分类错误率,回归任务就计算均方差。

function accuracy=fitness(xx,P_train,T_train,P_test,T_test,layers,activatation,kernel)
rng('default')hidden=xx(1:layers); %各隐含层节点数
lambda=xx(layers+1); %L2正则化系数
para=xx(layers+2:end); %顶层kelm惩罚系数与核参数delm=dkelmtrain(P_train,T_train,hidden,lambda,activatation,para,kernel);
T2=dkelmpredict(delm,para,kernel,P_test,P_train);
% 如果是分类任务
[~ ,J2]=max(T2,[],2);
[~ ,J3]=max(T_test,[],2);
accuracy=1-sum(J2==J3)/length(J2); %以最小化分类错误率作为适应度值,优化算法的目的就是找到一组最优超参数,用这组超参数训练 的网络,可以使得使得网络的错误率最低% 如果是回归任务
%[m,m]=size(T2);
%T2=reshape(T2,[1,m*n]);
%T_test=reshape(T_test,[1,m*n]);%accuracy=mse(T2,T_test); %以最小化预测值与实际值的均方差作为适应度值,优化算法的目的就是找到一组最优超参数,用这组超参数训练 的网络,可以使得使得网络的预测误差最低rng(sum(100*clock))

步骤3:在ssa将x传进适应度函数之前,我们还需要做一下参数范围的限制,目的1是怕x中的值不在lb、ub中,目的2是部分参数是整数,部分是小数,我们需要将x的值转成对应的类型。

function x = Bounds( x,  xmin, xmax,layers)
D=length(x);
for j=1:Dif j <=layersx(j)=round(x(j));%隐含层节点数是整数endif x(j)>xmax(j) | x(j)<xmin(j)if j>layersx(j)=(xmax(j)-xmin(j))*rand+xmin(j);  %elsex(j)=round((xmax(j)-xmin(j))*rand+xmin(j));  %endend
end

步骤4:主程序调用

%% 优化DKELM超参数,包括各隐含层节点数,正则化系数,顶层kelm的惩罚系数与核参数,
close all;clear;format compact;format short;clc;warning off
%% 
load data
P_train = double(train_x) ;%30*1000
P_test  = double(test_x);%30*100
T_train = double(train_Y);%5*1000
T_test  = double(test_Y);%5*100
%% 预先设定几个常用参数,这些设置的参数不参与寻优
layers=3;%layers个隐含层
TF='sig';%ELM-AE激活函数
%顶层核极限学习机参数
kernel='RBF_kernel';%核函数类型  RBF_kernel lin_kernel poly_kernel wav_kernel%%
[x,trace,result]=ssafordkelm(P_train,P_test,T_train,T_test,layers,TF,kernel); %优化DKELM超参数,包括各隐含层节点数,正则化系数,顶层kelm的惩罚系数与核参数figure
plot(trace)
title('适应度曲线')
xlabel('优化代数')
ylabel('适应度值')%% 将优化得到的参数解码出来
hidden=x(1:layers) %各隐含层节点数
lambda=x(layers+1) %L2正则化系数
kernelpara=x(layers+2:end) %顶层kelm惩罚系数与核参数%% 重新训练DKELM,看结果
rng('default')
delm=dkelmtrain(P_train,T_train,hidden,lambda,TF,kernelpara,kernel);
T1=dkelmpredict(delm,kernelpara,kernel,P_train,P_train);%训练集预测结果
T2=dkelmpredict(delm,kernelpara,kernel,P_test,P_train);%测试集预测结果
%如果是分类就计算分类正确率,如果是回归就计算预测的误差

其中用到的dkelmtrain dkelmpredict等函数,看我上一篇博客。

3.结语

本章我们将DKELM与麻雀优化算法结合起来。用麻雀优化算法来对dklem的参数进行寻优,下一篇我们继续对DKELM进行改进,更多内容请点击专栏获取。

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

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

相关文章

miniconda安装保姆级教程|win11|深度学习环境配置

一、官网安装miniconda miniconda官网&#xff1a;Miniconda - Anaconda 点击Download按钮 在红框位置输入邮箱并点击submit&#xff0c;下载链接将会发到邮箱中 邮箱中将会收到如图所示邮件&#xff0c;点击下载 选择windows对应的miniconda安装包 miniconda安装包安装完成如…

AI安全、大模型安全研究(DeepSeek)

DeepSeek 点燃AI应用革命之火,但安全 “灰犀牛” 正在逼近 DeepSeek-R1国产大模型的发布,以技术创新惊艳了全球,更是极致的性价比推动国内千行百业接入 AI,政府、企业竞速开发智能业务处理、智能客服、代码生成、营销文案等应用,“落地效率” 成为第一关键词。然而与此相…

机器学习——Numpy的神奇索引与布尔索引

在 NumPy 中&#xff0c;神奇索引&#xff08;Fancy Indexing&#xff09; 和 布尔索引&#xff08;Boolean Indexing&#xff09; 是两种强大的索引方式&#xff0c;用于从数组中提取特定元素或子集。以下是它们的详细说明和示例&#xff1a; 1. 神奇索引&#xff08;Fancy In…

Android Studio最后一个绑定JDK8的版本,但是官方下载是最新的,怎么下载Android Studio历史版本包,这篇文章帮你解决。

最近需要安装Android Studio 编辑器 发现官网最新的编辑器已经不支持 jdk8了 经过查阅资料&#xff1a; Android Studio最后一个绑定JDK8的版本:4.1.3 下载地址&#xff1a;https://developer.android.google.cn/studio/archive 如果你打开是这样的 下载页 这是因为你用的中…

Next-Auth 认证系统:用户与管理员双角色登录配置

概述 本文档介绍了如何使用 Next-Auth 配置一个同时支持普通用户和管理员用户登录的认证系统。 基本配置 首先&#xff0c;我们需要设置 Next-Auth 的基本配置&#xff0c;包括提供者、回调函数和页面路由。 import type { NextAuthConfig } from next-auth import type { …

CentOS配置永久静态IP

在 CentOS 6 中&#xff0c;配置永久 IP 地址需要修改网络配置文件。以下是详细步骤&#xff1a; 1. 找到网卡名称 首先&#xff0c;确定你需要配置 IP 的网卡名称&#xff0c;通常是 eth0 或类似的名称。 运行以下命令查看网卡信息&#xff1a; bash ifconfig或者&#xf…

springboot Actuator 指标分析

http.server.requests HTTP 接口性能瓶颈 http.server.requests.max system.cpu.usage 代码热点分析或横向扩容 核心接口性能指标&#xff0c;包含以下维度&#xff1a; count&#xff1a;请求总数 max/sum&#xff1a;最大及总响应时间 status&#xff1a;HTTP 状态码分布&a…

在K8S中挂载 Secret 到 Pod

在 Kubernetes 里&#xff0c;把 Secret 挂载到 Pod 中有两种主要方式&#xff1a;作为卷挂载和作为环境变量挂载。下面为你提供相应的代码示例。 作为卷挂载 Secret 将 Secret 作为卷挂载到 Pod 时&#xff0c;Secret 的每个键会成为挂载目录下的一个文件&#xff0c;文件内…

mac npm run dev报错 error:0308010C:digital envelope routines::unsupported

并且提示 Unsupported engine { npm WARN EBADENGINE package: achrinza/node-ipc9.2.2, npm WARN EBADENGINE required: { node: 8 || 10 || 12 || 14 || 16 || 17 }, npm WARN EBADENGINE current: { node: v18.18.0, npm: 9.8.1 } npm WARN EBADENGINE } package.jso…

「宇树科技」13家核心零部件供应商梳理!

2025年2月6日&#xff0c;摩根士丹利&#xff08;Morgan Stanley&#xff09;发布最新人形机器人研报&#xff1a;Humanoid 100: Mapping the Humanoid Robot Value Chain&#xff08;人形机器人100&#xff1a;全球人形机器人产业链梳理&#xff09;。 2025年2月20日&#xf…

MySQL 性能优化方向

MySQL 性能优化是一个系统性的工作,涉及数据库设计、查询优化、索引优化、硬件配置等多个方面。以下是 MySQL 性能优化的主要方向和具体优化方案: 一、数据库设计优化 1. 合理设计表结构 规范化设计:避免数据冗余,确保数据一致性。适度反规范化:在查询频繁的场景下,适当…

MyBatis plus详解

核心功能 代码生成器 它能够依据数据库表结构&#xff0c;自动生成涵盖实体类、Mapper 接口、Mapper XML 文件、Service 接口与实现类等在内的基础代码。开发人员只需简单配置数据库连接信息、表名以及生成代码的相关参数&#xff0c;即可快速生成符合项目规范的基础代码&…

背包问题——多重背包(C语言)

代码如下&#xff1a; #include<stdio.h>int knapsack(int weight[], int value[], int count[], int n, int capacity) {int* dp (int*)malloc(sizeof(int) * (capacity 1));for (int i 0; i < capacity; i){dp[i] 0;}for (int i 0; i < n; i)//核心代码{fo…

计算机技术系列博客——目录页(持续更新)

1.1 博客目录专栏 1.1.1 博客文章导航 计算机技术系列博客——目录页 1.1.2 网页资源整理 2.1 计算机科学理论 2.2 软件工程技术 2.2.1.1 编程语言 Java Java语言基础 (1) Java基础知识总结01——Java基础篇 (2) Java基础知识总结02——集合框架篇 (3) Java基础知识总结03—…

<项目> 主从Reactor模型的高并发服务器

目录 Reactor 概念 分类 单Reactor单线程 单Reactor多线程 多Reactor多线程 项目介绍 项目规划 模块关系 实现 TimerWheel -- 时间轮定时器 定时器系统调用 时间轮设计 通用类型Any Buffer Socket Channel Poller EventLoop&#xff08;核心&#xff09; eventfd 设计思路 …

车载以太网网络测试-20【传输层-DOIP协议-3】

1 摘要 本文继续对ISO 13400-2定义的节点管理报文进行介绍&#xff0c;主要对路由激活请求/响应报文以及在线检查请求/响应报文的作用、帧结构以及示例进行介绍。 上文回顾&#xff1a; 车载以太网网络测试-19【传输层-DOIP协议-2】 在进行详细介绍之前&#xff0c;还是先回顾…

Jvm运行时数据区有哪些

Jvm运行时数据区有哪些 程序计数器&#xff08;Program Counter Register&#xff09; 作用&#xff1a; 可以看作是当前线程所执行的字节码的行号指示器。在多线程环境下&#xff0c;每个线程都有自己独立的程序计数器&#xff0c;线程私有的&#xff0c;用于记录该线程正在执…

Compose 实践与探索十五 —— 自定义触摸

1、自定义触摸与一维滑动监测 之前我们在讲 Modifier 时讲过如下与手势检测相关的 Modifier&#xff1a; Modifier.clickable { } Modifier.combinedClickable { } Modifier.pointerInput {detectTapGestures { } }这里对以上内容就不再赘述了&#xff0c;直接去讲解更复杂的…

Python 中有哪些库可以帮助读取和操作 shapefile 文件?

Python操作Shapefile文件库推荐 1. PyShp (pyshp) 特点&#xff1a;纯Python实现&#xff0c;无外部依赖&#xff0c;轻量级&#xff0c;支持完整的Shapefile格式&#xff08;shp、dbf、shx&#xff09;读写。适用场景&#xff1a;基础读写、简单几何操作、文件格式转换。安装…

JSONPath 的介绍

JSONPath的起源 1. 起源背景 在讨论JSONPath的起源之前&#xff0c;让我们先了解JSONPath是什么。JSONPath 是一种查询语言&#xff0c;用于从JSON&#xff08;JavaScript Object Notation&#xff09;数据结构中提取数据。它允许开发者通过类似于XPath的表达式来定位JSON对象…