【风电功率预测】鲸鱼算法优化鲁棒极限学习机WOA-RELM风电功率预测【含Matlab源码 3511期】-程序员宅基地

技术标签: matlab  Matlab智能算法神经网络预测与分类(高阶版)  

在这里插入图片描述

一、鲸鱼算法优化鲁棒极限学习机风电数据预测

1 鲸鱼算法
一种元启发式优化算法,模拟座头鲸狩猎行为的元启发式优化算法。目前的工作与其他群优化算法相比的主要区别在于,采用随机或最佳搜索代理来模拟捕猎行为,并使用螺旋来模拟座头鲸的泡泡网攻击机制。该算法具有机制简单、参数少、寻优能力强等优点,在经济调度、最优控制、光伏系统、图像分割等方面得到广泛的应用。

2.1 算法基本原理
座头鲸有特殊的捕猎方法,这种觅食行为被称为泡泡网觅食法;标准 WOA 模拟了座头鲸特有的搜索方法和围捕机制,主要包括:围捕猎物、气泡网捕食、搜索猎物三个重要阶段。WOA 中每个座头鲸的位置代表一个潜在解,通过在解空间中不断更新鲸鱼的位置,最终获得全局最优解。

(1)围捕猎物(Encircling prey)
鲸鱼的搜索范围是全局解空间,需要先确定猎物的位置以便包围。由于最优设计在搜索速度中的位置不是先验已知的,因此WOA算法假定当前的最佳候选解是目标猎物或接近最优解。在定义了最佳搜索代理之后,其他搜索代理将尝试向最佳搜索代理更新它们的位置。

(2)气泡网捕食:
座头鲸捕食主要有两个机制:包围捕食和气泡网捕食。采用气泡网捕食时,座头鲸与猎物间的位置更新用对数螺旋方程表达.

(3)搜索猎物:
为保证所有鲸鱼能在解空间中充分搜索,WOA 根据鲸鱼彼此之间的距离来更新位置,达到随机搜索的目的。因此,当|A| ≥ 1|时,搜索个体会游向随机鲸。

2.2 算法基本流程
标准 WOA 主要依靠系数向量 A 选择搜索猎物的路径,并利用概率 p 决定最终捕食机制。
步骤 1:设置鲸鱼数量 N 和算法的最大迭代次数 tmax,初始化位置信息;
步骤 2:计算每条鲸鱼的适应度,找到当前最优鲸鱼的位置并保留,即 ;
步骤 3:计算参数 a、p 和系数向量 A、C。判断概率 p 是否小于 50%,是则直接转入步骤 4,否则采用气泡网捕食机制:利用式(2-1)进行位置更新;
步骤 4:判断系数向量 A 的绝对值是否小于 1,是则包围猎物:按式(1-2)更新位置;否则全局随机搜索猎物:按式(3-1)更新位置;
步骤 5:位置更新结束,计算每条鲸鱼的适应度,并与先前保留的最优鲸鱼的位置比较,若优于,则利用新的最优解替换;
步骤 6:判断当前计算是否达到最大迭代次数,如果是,则获得最优解,计算结束,否则进入下一次迭代,并返回步骤 3。
WOA算法首先随机初始化一组解,在每次迭代中,搜索代理根据随机选择的搜索代理或到目前为止获得的最优解更新它们的位置。将 a 参数由 2 随迭代次数降为 0,从而由探索逐步到利用。当 |A|>1 时选择随机搜索代理,|A|< 1时选择最优解更新搜索代理位置。根据 p 的值,WOA可以在螺旋运动和圆环运动之间进行切换。最后,通过满足终止准则来终止WOA算法。

2 鲁棒极限学习机
鲁棒极限学习机(Robust Extreme Learning Machine, RELM)是一种基于极限学习机(Extreme Learning Machine, ELM)的算法,用于实现数据分类任务。RELM通过引入鲁棒损失函数,提高了ELM在面对噪声和异常值时的鲁棒性能。

RELM的实现步骤如下:
(1)数据预处理:对原始数据进行预处理,包括数据清洗、特征选择和特征缩放等操作。
(2)构建输入矩阵:将预处理后的数据按照矩阵的形式表示,其中每一行代表一个样本的特征,每一列代表一个特征。
(3)随机初始化输入权重:随机生成输入层到隐藏层的权重矩阵,其中隐藏层的节点数可以根据经验或者交叉验证进行选择。
(4)计算隐藏层输出:使用ReLU(Rectified Linear Unit)激活函数计算隐藏层的输出,即将输入矩阵与输入权重矩阵相乘,并将结果进行非线性变换。
(5)求解输出权重:使用最小二乘法或者正则化方法求解输出权重矩阵,将隐藏层输出与样本的标签进行拟合。
(6)预测分类结果:使用求解得到的输出权重矩阵,将测试样本的特征与隐藏层输出进行相乘,并通过激活函数得到预测的分类结果。
(7)模型评估:使用评估指标(如准确率、精确率、召回率等)对模型进行评估,可以使用交叉验证等方法进行评估结果的稳定性。
通过以上步骤,可以使用RELM实现数据的分类任务。相比于传统的ELM算法,RELM在面对噪声和异常值时具有更好的鲁棒性能,可以提高分类模型的准确性和稳定性。

二、部分源代码

%% 初始化
clear
close all
clc
format shortg
warning off
addpath(‘func_defined’)

%% 读取读取
data=xlsread(‘数据.xlsx’,‘Sheet1’,‘A1:N252’); %%使用xlsread函数读取EXCEL中对应范围的数据即可

%输入输出数据
input=data(:,1:end-1); %data的第一列-倒数第二列为特征指标
output=data(:,end); %data的最后面一列为输出的指标值

N=length(output); %全部样本数目
testNum=15; %设定测试样本数目
trainNum=N-testNum; %计算训练样本数目

%% 划分训练集、测试集
input_train = input(1:trainNum,:)‘;
output_train =output(1:trainNum)’;
input_test =input(trainNum+1:trainNum+testNum,:)‘;
output_test =output(trainNum+1:trainNum+testNum)’;

%% 数据归一化
[inputn,inputps]=mapminmax(input_train,-1,1);
[outputn,outputps]=mapminmax(output_train);
inputn_test=mapminmax(‘apply’,input_test,inputps);

%% 获取输入层节点、输出层节点个数
inputnum=size(input,2);
outputnum=size(output,2);
disp(‘/’)
disp(‘极限学习机ELM结构…’)
disp([‘输入层的节点数为:’,num2str(inputnum)])
disp([‘输出层的节点数为:’,num2str(outputnum)])
disp(’ ')
disp(‘隐含层节点的确定过程…’)

%确定隐含层节点个数
%注意:BP神经网络确定隐含层节点的方法是:采用经验公式hiddennum=sqrt(m+n)+a,m为输入层节点个数,n为输出层节点个数,a一般取为1-10之间的整数
%在极限学习机中,该经验公式往往会失效,设置较大的范围进行隐含层节点数目的确定即可。

MSE=1e+5; %初始化最小误差
for hiddennum=10:20

%用训练数据训练极限学习机模型

[IW0,B0,LW0,TF,TYPE] = elmtrain(inputn,outputn,hiddennum);

%对训练集仿真
an0=elmpredict(inputn,IW0,B0,LW0,TF,TYPE);  %仿真结果
mse0=mse(outputn,an0);  %仿真的均方误差
disp(['隐含层节点数为',num2str(hiddennum),'时,训练集的均方误差为:',num2str(mse0)])

%更新最佳的隐含层节点
if mse0<MSE
    MSE=mse0;
    hiddennum_best=hiddennum;
end

end
disp([‘最佳的隐含层节点数为:’,num2str(hiddennum_best),‘,相应的均方误差为:’,num2str(MSE)])

%% 训练最佳隐含层节点的极限学习机模型
disp(’ ')
disp(‘RELM极限学习机:’)
[IW0,B0,LW0,TF,TYPE] = elmtrain(inputn,outputn,hiddennum_best);

%% 模型测试
an0=elmpredict(inputn_test,IW0,B0,LW0,TF,TYPE); %用训练好的模型进行仿真
test_simu0=mapminmax(‘reverse’,an0,outputps); % 预测结果反归一化
%误差指标
[mae0,mse0,rmse0,mape0,error0,errorPercent0]=calc_error(output_test,test_simu0);

%% 麻雀算法寻最优权值阈值
disp(’ ')
disp(‘WOA优化ELM极限学习机:’)
%初始化WOA参数
N=20; %初始种群规模
M=30; %最大进化代数
dim=inputnumhiddennum_best+hiddennum_best; %自变量个数
%自变量下限
lb=[-ones(1,inputnum
hiddennum_best) … %输入层到隐含层的连接权值范围是[-1 1] 下限为-1
zeros(1,hiddennum_best)]; %隐含层阈值范围是[0 1] 下限为0
%自变量上限
ub=ones(1,dim);
fobj =@(x) fitness(x,hiddennum_best, inputn, outputn, output_train, inputn_test ,outputps, output_test);
[bestX,Best_score,Convergence_curve]=WOA(N,M, lb, ub,dim,fobj);
%% 绘制进化曲线
figure
plot(Convergence_curve,‘r-’,‘linewidth’,2)
xlabel(‘进化代数’)
ylabel(‘均方误差’)
legend(‘最佳适应度’)
title(‘WOA的进化曲线’)

%% 优化后的参数训练RELM极限学习机模型
[IW1,B1,LW1,TF,TYPE] = elmtrain(inputn,outputn,hiddennum_best,bestX ); %IW1 B1 LW1为优化后的ELM求得的训练参数
hiddennum_best
%% 优化后的RELM模型测试
an1=elmpredict(inputn_test,IW1,B1,LW1,TF,TYPE);
test_simu1=mapminmax(‘reverse’,an1,outputps);

%误差指标
[mae1,mse1,rmse1,mape1,error1,errorPercent1]=calc_error(output_test,test_simu1);

%% 作图
figure
plot(output_test,‘b-.o’,‘linewidth’,2)
hold on
plot(test_simu0,‘g-s’,‘linewidth’,2)
hold on
plot(test_simu1,‘r-p’,‘linewidth’,2)
legend(‘真实值’,‘RELM预测值’,‘WOA-RELM预测值’)
xlabel(‘测试样本编号’)
ylabel(‘指标值’)
title(‘优化前后的RELM模型预测值和真实值对比图’)

figure
plot(error0,‘b-s’,‘markerfacecolor’,‘g’)
hold on
plot(error1,‘r-p’,‘markerfacecolor’,‘g’)
legend(‘RELM预测误差’,‘WOA-RELM预测误差’)
xlabel(‘测试样本编号’)
ylabel(‘预测偏差’)
title(‘优化前后的RELM模型预测值和真实值误差对比图’)

三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]赵侃,师芸,牛敏杰,王虎勤.基于改进麻雀搜索算法优化BP神经网络的PM2.5浓度预测[J].测绘通报. 2022(10)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_63266434/article/details/134633155

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签