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.pswp.cn/news/898658.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898658.shtml
英文地址,請注明出處:http://en.pswp.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對象…