【回归预测-ELM预测】基于粒子群算法PSO优化极限学习机预测附matlab代码

1 内容介绍

风电功率预测为电网规划提供重要的依据,研究风电功率预测方法对确保电网在安全稳定运行下接纳更多的风电具有重要的意义.针对极限学习机(ELM)回归模型预测结果受输入参数影响的问题,现将粒子群优化算法(PSO)应用于ELM中,提出了一种基于粒子群优化极限学习机的风功率预测方法.该方法首先将数值天气预报信息(NWP)数据进行数据预处理,并构建出训练样本集,随后建立ELM模型,利用粒子群算法优化ELM中的输入权值和阈值,从而建立起基于NWP和PSO-ELM风功率预测模型.对华东地区3个不同装机容量的风场NWP数据进行实验.结果表明:该方法的预测精度高且稳定性能好,能够为风电场功率预测以及风电并网安全可靠性提供科学有效的参考依据.

风的随机性和波动性导致了风电功率的不平 稳性,风电场的接入影响电网的稳定运行环境[1]。 对风电场的输出功率进行精准预测,有助于电网人 员根据风电场输出功率的变化调整发电计划,减少 电网的备用容量以节约能源的消耗。因此,有效的 风电功率预测方法可保障电网的稳定经济运行。 目前,国内外研究人员做了大量的工 作,研 究 方法主要包括物理方法、统计方法以及神经网络方 法[2]。其中物理方法要求风机相关物理信息,建模 复杂且 精 度 不 稳 定。统 计 方 法 模 型 简 单、数 据 单 一,但预测的精度受时间的限制,预测时间越长精 度越低,通常应用于超短期预测。神经网络方法泛 化能力强,能够处理回归问题,适用于风功率预测。 极 限 学 习 机 (Extreme Learning Machine, ELM)是一类基于前馈神经网络的算法[3]。ELM 因结构简单、学习效率高,被用以解决回归、聚类、 分类等问题。ELM 算法的优化问题被很多学者研 究,王浩等[4]利用遗传算法优化极限学习机,并将 风电系统参数模糊化,从而提高预测模型的精度。 龙浩[5]提出了加权极限学习机方法,旨在解决样本 数据不均衡的问题。王文锦等[6]利用蜂群算 法 优 化 ELM,旨在提高模型的稳定性 能。王 宏 刚 等[7] 将蜻蜓算法(DragonflyAlgorithm,DA)分布式应 用于 ELM,优化初始化输入权重和阈值的影响,有 效提高了电能质量扰动识别率。 风电功率的预测主要基于当日的数值天气预 报信 息 (Numerical WeatherPrediction,NWP)。 NWP包括风速、风向、温度、湿度以及气压[8]。实 测 NWP数据在同一风功率下存在奇异值以及波 动的问题。关于风功率 NWP数据的预处理问题, 符杨等[9]针对 NWP数据不准确、爬坡事件频发等 原因将 NWP 数据分类,并对功率波动进 行 预 测。 杨茂等[10]利用经验模态分解对风功率数据进行分 解去噪重构,一定程度上减少了噪点对预测结果的 影响。杨家然等[11]利用模糊聚类的方法将原始信 号进行分类,采用不同的模型组合预测。 本 文 将 粒 子 群 优 化 算 法 (Particle Swarm Optimization,PSO)和 ELM 结 合,欲 提 高 传 统 ELM 预测模型的精度和稳定性能,从而 为 风 电 功 率预测技术提供新的方法。

基本理论

1.1 ELM 算法

ELM 因学习效率高被普遍应用于风电功率预测、变压器故障诊断、风机故障诊断等方面。该 算法任意赋值输入层权重和阈值,训练过程中无需改变模型参数,仅设定隐层神经元个数,便可通过最小二乘法获得输出层权重。

【回归预测-ELM预测】基于粒子群算法PSO优化极限学习机预测附matlab代码

【回归预测-ELM预测】基于粒子群算法PSO优化极限学习机预测附matlab代码

1.2 PSO-ELM 预测模型 如前文所述,ELM 的 初 始 输 入 权 值 和 阈 值 是 随机确 定 的,其 训 练 的 效 果 会 受 初 始 值 影 响。因 此,采用 PSO 优化 ELM 的输入权重和阈值,可避 免盲目 性 训 练 ELM 模 型。PSO 算 法 优 化 ELM 的步骤中,先 初 始 化 PSO 参 数,包括粒子群的规 模、空间维度、惯性参数w、学习因子c1 和c2、迭代 次数和最 大 速 度vmax等。PSO-ELM 预 测 模 型 是 将每个粒子对应的输入权值和阈值代入 ELM 预 测模型中,将 ELM 学习样本输出与实际输出的均 方误差(MeanSquaredError,MSE)作为 PSO 的 适应度。将粒子的当前适应度与最优适应度做对 比,若比最优适应度小,说明当前输入权值和阈值 所建立的 ELM 模型进行预测产生的均方误差较 小,则将当前适应度更新为最优适应度,将当前位 置更新为Pb,否则保持最优适应度不变。同 理 比 较适应度和全局适应 度,更 新 Gb。当 迭 代 次 数 达 到最大值或适应度达到设定值时停止算法。PSO 优化得到的最优输入权值 W 和 阈 值b 后,代 入 ELM 模型中进行预测。具体步骤如图1所示。

【回归预测-ELM预测】基于粒子群算法PSO优化极限学习机预测附matlab代码

2 仿真代码

%% &#x6781;&#x9650;&#x5B66;&#x4E60;&#x673A;&#x5728;&#x56DE;&#x5F52;&#x62DF;&#x5408;&#x95EE;&#x9898;&#x4E2D;&#x7684;&#x5E94;&#x7528;&#x7814;&#x7A76;<br> %% &#x5BFC;&#x5165;&#x6570;&#x636E;<br> clear all;clc<br> load data<br> % &#x968F;&#x673A;&#x751F;&#x6210;&#x8BAD;&#x7EC3;&#x96C6;&#x3001;&#x6D4B;&#x8BD5;&#x96C6;<br> k = randperm(size(input,1));<br> % &#x8BAD;&#x7EC3;&#x96C6;&#x2014;&#x2014;1900&#x4E2A;&#x6837;&#x672C;<br> P_train=input(k(1:1900),:)';<br> T_train=output(k(1:1900));<br> % &#x6D4B;&#x8BD5;&#x96C6;&#x2014;&#x2014;100&#x4E2A;&#x6837;&#x672C;<br> P_test=input(k(1901:2000),:)';<br> T_test=output(k(1901:2000));<br> %% &#x5F52;&#x4E00;&#x5316;

% &#x8BAD;&#x7EC3;&#x96C6;<br> [Pn_train,inputps] = mapminmax(P_train,-1,1);<br> Pn_test = mapminmax('apply',P_test,inputps);<br> % &#x6D4B;&#x8BD5;&#x96C6;<br> [Tn_train,outputps] = mapminmax(T_train,-1,1);<br> Tn_test = mapminmax('apply',T_test,outputps);<br> tic<br> %% &#x8282;&#x70B9;&#x4E2A;&#x6570;<br> inputnum=2; &#xA0;<br> hiddennum=20; &#xA0; &#xA0; &#xA0; &#xA0;&#xA0;<br> outputnum=1;<br> %% &#x53C2;&#x6570;&#x521D;&#x59CB;&#x5316;<br> %&#x7C92;&#x5B50;&#x7FA4;&#x7B97;&#x6CD5;&#x4E2D;&#x7684;&#x4E24;&#x4E2A;&#x53C2;&#x6570;<br> c1 = 1.49445;<br> c2 = 1.49445;<br> maxgen=100; &#xA0; &#xA0; &#xA0; % &#x8FDB;&#x5316;&#x6B21;&#x6570; &#xA0;<br> sizepop=30; &#xA0; &#xA0; &#xA0; % &#x79CD;&#x7FA4;&#x89C4;&#x6A21;<br> Vmax=10^(2); &#xA0; &#xA0; &#xA0;% &#x6700;&#x5927;&#x901F;&#x5EA6;<br> Vmin=-Vmax; &#xA0; &#xA0; &#xA0; % &#x6700;&#x5C0F;&#x901F;&#x5EA6;<br> function Y = elmpredict(P,IW,B,LW)<br> Q = size(P,2);<br> BiasMatrix = repmat(B,1,Q);<br> tempH = IW * P + BiasMatrix;<br> H = 1 ./ (1 + exp(-tempH));<br> % &#x8BA1;&#x7B97;&#x9884;&#x6D4B;&#x8F93;&#x51FA;

% &#x968F;&#x673A;&#x751F;&#x6210;&#x8BAD;&#x7EC3;&#x96C6;&#x3001;&#x6D4B;&#x8BD5;&#x96C6;<br> k = randperm(size(input,1));<br> % &#x8BAD;&#x7EC3;&#x96C6;&#x2014;&#x2014;1900&#x4E2A;&#x6837;&#x672C;<br> P_train=input(k(1:1900),:)';<br> T_train=output(k(1:1900));<br> % &#x6D4B;&#x8BD5;&#x96C6;&#x2014;&#x2014;100&#x4E2A;&#x6837;&#x672C;<br> P_test=input(k(1901:2000),:)';<br> T_test=output(k(1901:2000));<br> %% &#x5F52;&#x4E00;&#x5316;<br> % &#x8BAD;&#x7EC3;&#x96C6;<br> [Pn_train,inputps] = mapminmax(P_train,-1,1);<br> Pn_test = mapminmax('apply',P_test,inputps);<br> % &#x6D4B;&#x8BD5;&#x96C6;<br> [Tn_train,outputps] = mapminmax(T_train,-1,1);<br> Tn_test = mapminmax('apply',T_test,outputps);<br> Y = (H' * LW)';<br> disp(zbest)<br> x=zbest;%% &#x4F18;&#x5316;&#x7ED3;&#x675F;&#x540E;&#x79CD;&#x7FA4;&#x4E2D;&#x7684;&#x6700;&#x597D;&#x4E2A;&#x4F53;<br> IW=x(1:inputnum*hiddennum);&#xA0;<br> B=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);&#xA0;<br> %&#x8D4B;&#x7ED9;&#x7F51;&#x7EDC;&#x6743;&#x503C;&#x548C;&#x9608;&#x503C;<br> IW=reshape(IW,hiddennum,inputnum);<br> B=reshape(B,hiddennum,1);<br> %% ELM&#x521B;&#x5EFA;/&#x8BAD;&#x7EC3;<br> LW = elmtrain(IW,B,Pn_train,Tn_train,'sig');<br> % &#x968F;&#x673A;&#x751F;&#x6210;&#x8BAD;&#x7EC3;&#x96C6;&#x3001;&#x6D4B;&#x8BD5;&#x96C6;<br> k = randperm(size(input,1));<br> % &#x8BAD;&#x7EC3;&#x96C6;&#x2014;&#x2014;1900&#x4E2A;&#x6837;&#x672C;<br> P_train=input(k(1:1900),:)';<br> T_train=output(k(1:1900));<br> % &#x6D4B;&#x8BD5;&#x96C6;&#x2014;&#x2014;100&#x4E2A;&#x6837;&#x672C;<br> P_test=input(k(1901:2000),:)';<br> T_test=output(k(1901:2000));<br> %% &#x5F52;&#x4E00;&#x5316;<br> % &#x8BAD;&#x7EC3;&#x96C6;

% &#x968F;&#x673A;&#x751F;&#x6210;&#x8BAD;&#x7EC3;&#x96C6;&#x3001;&#x6D4B;&#x8BD5;&#x96C6;<br> k = randperm(size(input,1));<br> % &#x8BAD;&#x7EC3;&#x96C6;&#x2014;&#x2014;1900&#x4E2A;&#x6837;&#x672C;<br> P_train=input(k(1:1900),:)';<br> T_train=output(k(1:1900));<br> % &#x6D4B;&#x8BD5;&#x96C6;&#x2014;&#x2014;100&#x4E2A;&#x6837;&#x672C;<br> P_test=input(k(1901:2000),:)';<br> T_test=output(k(1901:2000));<br> %% &#x5F52;&#x4E00;&#x5316;

% &#x8BAD;&#x7EC3;&#x96C6;<br> [Pn_train,inputps] = mapminmax(P_train,-1,1);<br> Pn_test = mapminmax('apply',P_test,inputps);<br> % &#x6D4B;&#x8BD5;&#x96C6;<br> [Tn_train,outputps] = mapminmax(T_train,-1,1);<br> Tn_test = mapminmax('apply',T_test,outputps);<br> tic<br> %% &#x8282;&#x70B9;&#x4E2A;&#x6570;<br> inputnum=2; &#xA0;<br> hiddennum=20; &#xA0; &#xA0; &#xA0; &#xA0;&#xA0;<br> outputnum=1;<br> %% &#x53C2;&#x6570;&#x521D;&#x59CB;&#x5316;<br> %&#x7C92;&#x5B50;&#x7FA4;&#x7B97;&#x6CD5;&#x4E2D;&#x7684;&#x4E24;&#x4E2A;&#x53C2;&#x6570;<br> c1 = 1.49445;<br> c2 = 1.49445;<br> maxgen=100; &#xA0; &#xA0; &#xA0; % &#x8FDB;&#x5316;&#x6B21;&#x6570; &#xA0;<br> sizepop=30; &#xA0; &#xA0; &#xA0; % &#x79CD;&#x7FA4;&#x89C4;&#x6A21;<br> Vmax=10^(2); &#xA0; &#xA0; &#xA0;% &#x6700;&#x5927;&#x901F;&#x5EA6;<br> Vmin=-Vmax; &#xA0; &#xA0; &#xA0; % &#x6700;&#x5C0F;&#x901F;&#x5EA6;<br> function Y = elmpredict(P,IW,B,LW)<br> Q = size(P,2);<br> BiasMatrix = repmat(B,1,Q);<br> tempH = IW * P + BiasMatrix;<br> H = 1 ./ (1 + exp(-tempH));<br> % &#x8BA1;&#x7B97;&#x9884;&#x6D4B;&#x8F93;&#x51FA;

% &#x968F;&#x673A;&#x751F;&#x6210;&#x8BAD;&#x7EC3;&#x96C6;&#x3001;&#x6D4B;&#x8BD5;&#x96C6;<br> k = randperm(size(input,1));<br> % &#x8BAD;&#x7EC3;&#x96C6;&#x2014;&#x2014;1900&#x4E2A;&#x6837;&#x672C;<br> P_train=input(k(1:1900),:)';<br> T_train=output(k(1:1900));<br> % &#x6D4B;&#x8BD5;&#x96C6;&#x2014;&#x2014;100&#x4E2A;&#x6837;&#x672C;<br> P_test=input(k(1901:2000),:)';<br> T_test=output(k(1901:2000));<br> %% &#x5F52;&#x4E00;&#x5316;<br> % &#x8BAD;&#x7EC3;&#x96C6;

[Pn_train,inputps] = mapminmax(P_train,-1,1);<br> Pn_test = mapminmax('apply',P_test,inputps);<br> % &#x6D4B;&#x8BD5;&#x96C6;<br> [Tn_train,outputps] = mapminmax(T_train,-1,1);<br> Tn_test = mapminmax('apply',T_test,outputps);<br> %% &#x7ED3;&#x679C;&#x5BF9;&#x6BD4;<br> result = [T_test' T_sim'];<br> % &#x5747;&#x65B9;&#x8BEF;&#x5DEE;<br> E = mse(T_sim - T_test)<br> % &#x51B3;&#x5B9A;&#x7CFB;&#x6570;<br> N = length(T_test);<br> R2 = (N*sum(T_sim.*T_test)-sum(T_sim)*sum(T_test))^2/((N*sum((T_sim).^2)-(sum(T_sim))^2)*(N*sum((T_test).^2)-(sum(T_test))^2))<br> %% &#x7ED8;&#x56FE;<br> figure<br> plot(1:length(T_test),T_test,'r*')<br> hold on<br> plot(1:length(T_sim),T_sim,'b:o')<br> xlabel('&#x6D4B;&#x8BD5;&#x96C6;&#x6837;&#x672C;&#x7F16;&#x53F7;')<br> ylabel('&#x6D4B;&#x8BD5;&#x96C6;&#x8F93;&#x51FA;')<br> title('ELM&#x6D4B;&#x8BD5;&#x96C6;&#x8F93;&#x51FA;')<br> legend('&#x671F;&#x671B;&#x8F93;&#x51FA;','&#x9884;&#x6D4B;&#x8F93;&#x51FA;')

figure<br> plot(1:length(T_test),T_test-T_sim,'r-*')<br> xlabel('&#x6D4B;&#x8BD5;&#x96C6;&#x6837;&#x672C;&#x7F16;&#x53F7;')<br> ylabel('&#x7EDD;&#x5BF9;&#x8BEF;&#x5DEE;')<br> title('ELM&#x6D4B;&#x8BD5;&#x96C6;&#x9884;&#x6D4B;&#x8BEF;&#x5DEE;')

function Y = elmpredict(P,IW,B,LW)<br> Q = size(P,2);<br> BiasMatrix = repmat(B,1,Q);<br> tempH = IW * P + BiasMatrix;<br> H = 1 ./ (1 + exp(-tempH));<br> % &#x8BA1;&#x7B97;&#x9884;&#x6D4B;&#x8F93;&#x51FA;<br> Y = (H' * LW)';

% &#x968F;&#x673A;&#x751F;&#x6210;&#x8BAD;&#x7EC3;&#x96C6;&#x3001;&#x6D4B;&#x8BD5;&#x96C6;<br> k = randperm(size(input,1));<br> % &#x8BAD;&#x7EC3;&#x96C6;&#x2014;&#x2014;1900&#x4E2A;&#x6837;&#x672C;<br> P_train=input(k(1:1900),:)';<br> T_train=output(k(1:1900));<br> % &#x6D4B;&#x8BD5;&#x96C6;&#x2014;&#x2014;100&#x4E2A;&#x6837;&#x672C;<br> P_test=input(k(1901:2000),:)';<br> T_test=output(k(1901:2000));<br> %% &#x5F52;&#x4E00;&#x5316;

% &#x8BAD;&#x7EC3;&#x96C6;<br> [Pn_train,inputps] = mapminmax(P_train,-1,1);<br> Pn_test = mapminmax('apply',P_test,inputps);<br> % &#x6D4B;&#x8BD5;&#x96C6;<br> [Tn_train,outputps] = mapminmax(T_train,-1,1);<br> Tn_test = mapminmax('apply',T_test,outputps);<br> tic<br> %% &#x8282;&#x70B9;&#x4E2A;&#x6570;<br> inputnum=2; &#xA0;<br> hiddennum=20; &#xA0; &#xA0; &#xA0; &#xA0;&#xA0;<br> outputnum=1;<br> %% &#x53C2;&#x6570;&#x521D;&#x59CB;&#x5316;<br> %&#x7C92;&#x5B50;&#x7FA4;&#x7B97;&#x6CD5;&#x4E2D;&#x7684;&#x4E24;&#x4E2A;&#x53C2;&#x6570;<br> c1 = 1.49445;<br> c2 = 1.49445;<br> maxgen=100; &#xA0; &#xA0; &#xA0; % &#x8FDB;&#x5316;&#x6B21;&#x6570; &#xA0;<br> sizepop=30; &#xA0; &#xA0; &#xA0; % &#x79CD;&#x7FA4;&#x89C4;&#x6A21;<br> Vmax=10^(2); &#xA0; &#xA0; &#xA0;% &#x6700;&#x5927;&#x901F;&#x5EA6;<br> Vmin=-Vmax; &#xA0; &#xA0; &#xA0; % &#x6700;&#x5C0F;&#x901F;&#x5EA6;<br> function Y = elmpredict(P,IW,B,LW)<br> Q = size(P,2);<br> BiasMatrix = repmat(B,1,Q);<br> tempH = IW * P + BiasMatrix;<br> H = 1 ./ (1 + exp(-tempH));<br> % &#x8BA1;&#x7B97;&#x9884;&#x6D4B;&#x8F93;&#x51FA;

%% SOTracking – Single Object Tracking
% data format
% data format: 1-X, 2-Y, 3-Z, 4-RANGE, 5-AZIMUTH, 6-ELEVATION, 7-DOPPLER,
% 8-POWER, 9-POWER_VALUE, 10-TIMESTAMP_MS

%% env init
clear, clc, close
addpath(genpath(‘./utils’));

%% param
% path and data
result_dir = ‘./result/’;
data_dir = ‘./data/mmWave_radar_data/’;
data_item = ‘SOT/’;

start_frame = 1;
end_frame = 10000;
traj_dim = 2; % 2d/3d trajectory

% denoise
param_denoise.dpl_thr = 0.15;
param_denoise.loc_thr = [-40, 40, 0, 40, -5, 40];

% cluster
epsilon = 5;
MinPts = 20;
obj_count = 1;

% Kalman filter
motion_type = ‘ConstantVelocity’; % ‘ConstantVelocity’ | ‘ConstantAcceleration’
param_kf = getDefaultKFParameters(motion_type);
% param.initialEstimateError = 1E5 * ones(1, 2);
% param.motionNoise = [25, 10];
param.measurementNoise = 100;

% show
% axis_range = [-5, 5, 0, 20, -2, 5];
axis_range = [-10, 10, 0, 20, -1, 5];
show_delay = 0.0;

%% denoise, cluster, KF_tracking
% —- file info —-
datas = dir([data_dir data_item ‘*.txt’]);
data_names = {datas.name};
data_num = length(data_names);
end_frame = min(data_num, end_frame);
if start_frame>end_frame
error(“start frame over range”)
end

% —- init —-
KF = []; % KF handle
det_loc = []; % detected location
meas_traj = NaN(start_frame-1,traj_dim); % trajectory points
kf_traj = NaN(start_frame-1,traj_dim); % KF corrected trajectory points
bounding_box = NaN(start_frame-1,traj_dim*2); % bounding box
isDetected = false; % detected flag

figure;

for k = start_frame:end_frame
% —- load data
frame=importdata([data_dir data_item data_names{k}]);

% —- denoise —-
frame_clean = point_cloud_denoise(frame, param_denoise);
disp([‘effective points num: ‘ num2str(size(frame_clean,1))])

% [ToDo] TBD
if size(frame_clean, 1) < 4
isDetected = false;
end

idx = DBSCAN(frame_clean(:,[1,2]),epsilon,MinPts); % DBSCAN Cluster

% delete noise points cluster(idx==0)
frame_clean(idx==0,:) = [];
idx(idx==0,:) = [];

% [idx,C] = kmeans(frame_doppler(:,[1,2]),2); % K-Means Cluster

[idx, Dg] = cluster_idx_arranege(frame_clean(:,[1,2]), idx);
disp([‘cluster count:’ num2str(numel(unique(idx)))])

if isempty(idx)
isDetected = false;
else
isDetected = true;
end

if isDetected
frame_obj = frame_clean(idx

Original: https://blog.csdn.net/matlab_dingdang/article/details/126024381
Author: matlab_dingdang
Title: 【回归预测-ELM预测】基于粒子群算法PSO优化极限学习机预测附matlab代码

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/180228/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总