【回归预测-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 因學習效率高被普遍應用于風電功率預測、變壓器故障診斷、風機故障診斷等方面。該 算法任意賦值輸入層權重和閾值,訓練過程中無需改變模型參數,僅設定隱層神經元個數,便可通過最小二乘法獲得輸出層權重。
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所示。
2 仿真代碼
%% 極限學習機在回歸擬合問題中的應用研究
%% 導入數據
clear all;clc
load data
% 隨機生成訓練集、測試集
k = randperm(size(input,1));
% 訓練集——1900個樣本
P_train=input(k(1:1900),:)';
T_train=output(k(1:1900));
% 測試集——100個樣本
P_test=input(k(1901:2000),:)';
T_test=output(k(1901:2000));
%% 歸一化
% 訓練集
[Pn_train,inputps] = mapminmax(P_train,-1,1);
Pn_test = mapminmax('apply',P_test,inputps);
% 測試集
[Tn_train,outputps] = mapminmax(T_train,-1,1);
Tn_test = mapminmax('apply',T_test,outputps);
tic
%% 節點個數
inputnum=2; ?
hiddennum=20; ? ? ? ??
outputnum=1;
%% 參數初始化
%粒子群算法中的兩個參數
c1 = 1.49445;
c2 = 1.49445;
maxgen=100; ? ? ? % 進化次數 ?
sizepop=30; ? ? ? % 種群規模
Vmax=10^(2); ? ? ?% 最大速度
Vmin=-Vmax; ? ? ? % 最小速度
function Y = elmpredict(P,IW,B,LW)
Q = size(P,2);
BiasMatrix = repmat(B,1,Q);
tempH = IW * P + BiasMatrix;
H = 1 ./ (1 + exp(-tempH));
% 計算預測輸出
% 隨機生成訓練集、測試集
k = randperm(size(input,1));
% 訓練集——1900個樣本
P_train=input(k(1:1900),:)';
T_train=output(k(1:1900));
% 測試集——100個樣本
P_test=input(k(1901:2000),:)';
T_test=output(k(1901:2000));
%% 歸一化
% 訓練集
[Pn_train,inputps] = mapminmax(P_train,-1,1);
Pn_test = mapminmax('apply',P_test,inputps);
% 測試集
[Tn_train,outputps] = mapminmax(T_train,-1,1);
Tn_test = mapminmax('apply',T_test,outputps);
Y = (H' * LW)';
disp(zbest)
x=zbest;%% 優化結束后種群中的最好個體
IW=x(1:inputnum*hiddennum);?
B=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);?
%賦給網絡權值和閾值
IW=reshape(IW,hiddennum,inputnum);
B=reshape(B,hiddennum,1);
%% ELM創建/訓練
LW = elmtrain(IW,B,Pn_train,Tn_train,'sig');
% 隨機生成訓練集、測試集
k = randperm(size(input,1));
% 訓練集——1900個樣本
P_train=input(k(1:1900),:)';
T_train=output(k(1:1900));
% 測試集——100個樣本
P_test=input(k(1901:2000),:)';
T_test=output(k(1901:2000));
%% 歸一化
% 訓練集
% 隨機生成訓練集、測試集
k = randperm(size(input,1));
% 訓練集——1900個樣本
P_train=input(k(1:1900),:)';
T_train=output(k(1:1900));
% 測試集——100個樣本
P_test=input(k(1901:2000),:)';
T_test=output(k(1901:2000));
%% 歸一化
% 訓練集
[Pn_train,inputps] = mapminmax(P_train,-1,1);
Pn_test = mapminmax('apply',P_test,inputps);
% 測試集
[Tn_train,outputps] = mapminmax(T_train,-1,1);
Tn_test = mapminmax('apply',T_test,outputps);
tic
%% 節點個數
inputnum=2; ?
hiddennum=20; ? ? ? ??
outputnum=1;
%% 參數初始化
%粒子群算法中的兩個參數
c1 = 1.49445;
c2 = 1.49445;
maxgen=100; ? ? ? % 進化次數 ?
sizepop=30; ? ? ? % 種群規模
Vmax=10^(2); ? ? ?% 最大速度
Vmin=-Vmax; ? ? ? % 最小速度
function Y = elmpredict(P,IW,B,LW)
Q = size(P,2);
BiasMatrix = repmat(B,1,Q);
tempH = IW * P + BiasMatrix;
H = 1 ./ (1 + exp(-tempH));
% 計算預測輸出
% 隨機生成訓練集、測試集
k = randperm(size(input,1));
% 訓練集——1900個樣本
P_train=input(k(1:1900),:)';
T_train=output(k(1:1900));
% 測試集——100個樣本
P_test=input(k(1901:2000),:)';
T_test=output(k(1901:2000));
%% 歸一化
% 訓練集
[Pn_train,inputps] = mapminmax(P_train,-1,1);
Pn_test = mapminmax('apply',P_test,inputps);
% 測試集
[Tn_train,outputps] = mapminmax(T_train,-1,1);
Tn_test = mapminmax('apply',T_test,outputps);
%% 結果對比
result = [T_test' T_sim'];
% 均方誤差
E = mse(T_sim - T_test)
% 決定系數
N = length(T_test);
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))
%% 繪圖
figure
plot(1:length(T_test),T_test,'r*')
hold on
plot(1:length(T_sim),T_sim,'b:o')
xlabel('測試集樣本編號')
ylabel('測試集輸出')
title('ELM測試集輸出')
legend('期望輸出','預測輸出')
figure
plot(1:length(T_test),T_test-T_sim,'r-*')
xlabel('測試集樣本編號')
ylabel('絕對誤差')
title('ELM測試集預測誤差')
function Y = elmpredict(P,IW,B,LW)
Q = size(P,2);
BiasMatrix = repmat(B,1,Q);
tempH = IW * P + BiasMatrix;
H = 1 ./ (1 + exp(-tempH));
% 計算預測輸出
Y = (H' * LW)';
% 隨機生成訓練集、測試集
k = randperm(size(input,1));
% 訓練集——1900個樣本
P_train=input(k(1:1900),:)';
T_train=output(k(1:1900));
% 測試集——100個樣本
P_test=input(k(1901:2000),:)';
T_test=output(k(1901:2000));
%% 歸一化
% 訓練集
[Pn_train,inputps] = mapminmax(P_train,-1,1);
Pn_test = mapminmax('apply',P_test,inputps);
% 測試集
[Tn_train,outputps] = mapminmax(T_train,-1,1);
Tn_test = mapminmax('apply',T_test,outputps);
tic
%% 節點個數
inputnum=2; ?
hiddennum=20; ? ? ? ??
outputnum=1;
%% 參數初始化
%粒子群算法中的兩個參數
c1 = 1.49445;
c2 = 1.49445;
maxgen=100; ? ? ? % 進化次數 ?
sizepop=30; ? ? ? % 種群規模
Vmax=10^(2); ? ? ?% 最大速度
Vmin=-Vmax; ? ? ? % 最小速度
function Y = elmpredict(P,IW,B,LW)
Q = size(P,2);
BiasMatrix = repmat(B,1,Q);
tempH = IW * P + BiasMatrix;
H = 1 ./ (1 + exp(-tempH));
% 計算預測輸出
%% 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<=obj_count,:);
?? ??? ?subplot(121)
?? ??? ?gscatter3(frame_obj(:,1),frame_obj(:,2),frame_obj(:,3),idx,[],[],10,'on')
?? ??? ?axis(axis_range)
?? ??? ?
?? ??? ?% calc bounding box
?? ??? ?rect_min = min(frame_obj(:,1:3),[],1);
?? ??? ?rect_max = max(frame_obj(:,1:3),[],1);
?? ??? ?rect_size = rect_max - rect_min;
?? ??? ?rect_center = calcCentroid(frame_obj(:,1:3));
?? ??? ?det_loc = rect_center(1:traj_dim);?
?? ??? ?% show bounding box
?? ??? ?plotBoundingbox(rect_min, rect_size, [0 0 1], 'obj1', k, axis_range)
?? ?
?? ?else
?? ??? ?det_loc = NaN(1,traj_dim);
?? ?end
?? ?
?? ?% Kalman Filter
?? ?[kf_loc, KF, states] = KF_step(det_loc, KF, param_kf);
?? ?if isempty(kf_loc)
?? ??? ?kf_loc = NaN(1,traj_dim);
?? ?end
?? ?
?? ?meas_traj(k,:) = det_loc;
?? ?kf_traj(k,:) = kf_loc;
?? ?
?? ?
?? ?% show trajectory
?? ?subplot(122)
% ?? ?cmpTraj(meas_traj, kf_traj, 'plot', 'xlim', axis_range(1:2), 'ylim', axis_range(3:4));
?? ?plotTraj(kf_traj, k, axis_range)
?? ?
?? ?figtitle(data_item(1:end-1),'color','blue','linewidth',4,'fontsize',15);
? ? drawnow
? ? pause(show_delay)
?? ?
end
%% save data
data_save_dir = [result_dir data_item 'ResData/'];
if ~exist(data_save_dir,'dir')
?? ?mkdir(data_save_dir)
end
save([data_save_dir 'traj.mat'], 'meas_traj', 'kf_traj')
disp(['result data saved to: ' data_save_dir])
%% -------------------------------------------------------
%% sub functions
% get KF default parameters
function param = getDefaultKFParameters(motion_type)
?? ?if nargin<1
?? ??? ?motion_type = 'ConstantVelocity';
?? ?end
?? ?
?? ?param.motionModel = motion_type;
?? ?param.initialLocation ? ? ? = 'Same as first detection';
?? ?
?? ?if strcmp(motion_type, 'ConstantAcceleration')
?? ? ?param.initialEstimateError ?= 1E5 * ones(1, 3);
?? ? ?param.motionNoise ? ? ? ? ? = [25, 10, 1];
?? ? ?param.measurementNoise ? ? ?= 25;
?? ?elseif strcmp(motion_type, 'ConstantVelocity')
?? ? ?param.initialEstimateError ?= 1E5 * ones(1, 2);
?? ? ?param.motionNoise ? ? ? ? ? = [25, 10];
?? ? ?param.measurementNoise ? ? ?= 25;?? ??? ?
?? ?else
?? ??? ?error(['No assigned motion type - ' motion_type])
?? ?end
end
function plotBoundingbox(rect_p, rect_size, clr, lgd, frame_idx, axis_range)
?? ?plotcube(rect_size, rect_p, 0.1, clr,lgd)
?? ?title(['Frame #' num2str(frame_idx) ' - 3D detection']);
?? ?xlabel('X'), ylabel('Y'), zlabel('Z');
?? ?axis(axis_range);
?? ?view(3);
?? ?grid on
end
function plotTraj(traj, frame_idx, axis_range)
?? ?if size(traj, 2)==2
?? ??? ?plot(traj(:,1),traj(:,2),'r-o','MarkerSize',4,'LineWidth',1.5)
?? ?elseif size(traj, 2)==3
?? ??? ?plot3(traj(:,1),traj(:,2),traj(:,3),'r-o','MarkerSize',4,'LineWidth',1.5)
?? ?end
?? ?
?? ?title(['Frame #' num2str(frame_idx) ' - XY trajectory']);
?? ?xlabel('X'), ylabel('Y'), zlabel('Z');
?? ?legend('KF Traj.')
?? ?axis(axis_range); ?
?? ?view(2);
?? ?grid on
end
%% MOTracking - Multiple 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 = 'MOT/';
start_frame = 1;
end_frame = 10000;
traj_dim = 2; % 2d/3d trajectory?
% denoise
param_denoise.dpl_thr = 0.1;
% detection
param_det.minObjPoints = 30;
param_det.DBSCAN_epsilon = 0.3;
param_det.DBSCAN_MinPts = 30;
% param_det.max_obj_count = 2;
% Kalman filter
motion_type = 'ConstantVelocity'; % 'ConstantVelocity' | 'ConstantAcceleration'
param_kf = getDefaultKFParameters(motion_type);
param.initialEstimateError ?= [200 50];
param.motionNoise ? ? ? ? ? = [100 25];
param.measurementNoise ? ? ?= 600;
% show
axis_range = [-5, 5, 0, 20, -2, 5];
% axis_range = [-20, 20, 0, 20, -10, 10];
%% 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
tracks = initializeTracks(); % object tracks
nextId = 1; % next track id
meas_traj = NaN(start_frame-1,traj_dim); % trajectory points
% 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(['clean points num: ' num2str(size(frame_clean,1))])
?? ?
?? ?% ---- detect ----
?? ?[centroids, bboxes, obj_frame, obj_idx, obj_features] = getDetections(frame_clean,param_det);
?? ?disp(['cluster count:' num2str(size(centroids,1))])
?? ?
?? ?% ---- track ----?
?? ?% predict new locations of last location (for cost calculation)
?? ?tracks = predictNewLocationsOfTracks(tracks);
?? ?% determine assignment of detection to tracks
?? ?[assignments, unassignedTracks, unassignedDetections] = ...
?? ?detectionToTrackAssignment(tracks, centroids, obj_frame, obj_idx, obj_features);
?? ?% undate assigned tracks
? ? tracks = updateAssignedTracks(tracks, assignments, centroids, bboxes);
?? ?
?? ?% update unassigned tracks;
? ? tracks = updateUnassignedTracks(tracks, unassignedTracks);
?? ?
?? ?% update track states
?? ?tracks = updateTrackStates(tracks);
?? ?
?? ?% create new tracks(tracks);
? ? [tracks,nextId] = createNewTracks(tracks, unassignedDetections, ...
?? ??? ?centroids, bboxes, obj_features, param_kf, nextId, k);
?? ?% display track results
? ? showTrackingResults(obj_frame, obj_idx, tracks, k, axis_range, data_item(1:end-1))
?? ?end
%% save data
data_save_dir = [result_dir data_item 'ResData/'];
if ~exist(data_save_dir,'dir')
?? ?mkdir(data_save_dir)
end
save([data_save_dir 'track.mat'], 'meas_traj', 'tracks')
disp(['result data saved to: ' data_save_dir])
%% -------------------------------------------------------
%% sub functions
% get KF default parameters
function param = getDefaultKFParameters(motion_type)
?? ?if nargin<1
?? ??? ?motion_type = 'ConstantVelocity';
?? ?end
?? ?
?? ?param.motionModel = motion_type;
?? ?param.initialLocation ? ? ? = 'Same as first detection';
?? ?
?? ?if strcmp(motion_type, 'ConstantAcceleration')
?? ? ?param.initialEstimateError ?= 1E5 * ones(1, 3);
?? ? ?param.motionNoise ? ? ? ? ? = [25, 10, 1];
?? ? ?param.measurementNoise ? ? ?= 25;
?? ?elseif strcmp(motion_type, 'ConstantVelocity')
?? ? ?param.initialEstimateError ?= 1E5 * ones(1, 2);
?? ? ?param.motionNoise ? ? ? ? ? = [25, 10];
?? ? ?param.measurementNoise ? ? ?= 25;?? ??? ?
?? ?else
?? ??? ?error(['No assigned motion type - ' motion_type])
?? ?end
end
% show tracking results
function showTrackingResults(obj_frame, obj_idx, tracks, frame_idx, axis_range, fig_name)
?? ?% init
?? ?% default bbox color
?? ?clr = [1 0 0;
?? ??? ? ? 0 1 0;
?? ??? ? ? 0 0 1;
?? ??? ? ? 0 1 1;
?? ??? ? ? 1 0 1;
?? ??? ? ? 1 1 0];
?? ?show_delay = 0.0;
?? ?% show 3d condition
?? ?minVisibleCount = 5; ? % minimal consecutive appearing frame count
?? ?maxInvisibleCount = 5; % maximal consecutive disappearing frame count
?? ?
?? ?% get normal tracks & effect tracks
?? ?normal_track_ind = ...
?? ??? ??? ?[tracks(:).totalVisibleCount] > minVisibleCount &...
?? ??? ??? ?[tracks(:).consecutiveInvisibleCount] < maxInvisibleCount &...
?? ??? ??? ?strcmp([tracks(:).state],"normal");?
?? ??? ?
?? ?normalTracks = tracks(normal_track_ind);
?? ?effect_track_ind = ...
?? ??? ??? ?[tracks(:).totalVisibleCount] > minVisibleCount &...
?? ??? ??? ?~strcmp([tracks(:).state],"noise");?
?? ?effectTracks = tracks(effect_track_ind);
?? ?
?? ?clf(gcf) % clear figure before new display
?? ?if ~ isempty(effectTracks) && ~isempty(obj_idx)
?? ??? ?% show 3d
?? ??? ?subplot(121)?? ??? ?
?? ??? ?% scatter3(obj_frame(:,1),obj_frame(:,2),obj_frame(:,3),10,'filled')
?? ??? ?gscatter3(obj_frame(:,1),obj_frame(:,2),obj_frame(:,3),obj_idx,0.3*ones(10,3),[],10,'off')
?? ??? ?for m = 1:length(normalTracks)
?? ??? ??? ?plotBoundingbox(normalTracks(m).bbox(1:3), normalTracks(m).bbox(4:6), clr(normalTracks(m).id,:), ['obj' num2str(normalTracks(m).id)], axis_range)
?? ??? ?end
?? ??? ?legend
??? ??? ?% view(2) % 2D view for debug
?? ??? ?% show 2D
?? ??? ?subplot(122)
?? ??? ?hold on
?? ??? ?for m = 1:length(effectTracks)
?? ??? ??? ?plotTraj(effectTracks(m).traj_rec(:,1:2), axis_range, ['obj' num2str(effectTracks(m).id)], clr(effectTracks(m).id,:))
?? ??? ?end
?? ??? ?hold off
?? ??? ?legend
?? ??? ?
?? ?end
?? ?
?? ?% fig info
?? ?figtitle([fig_name ' - Frame #' num2str(frame_idx)],'color','blue','linewidth',4,'fontsize',15);
? ? drawnow
? ? pause(show_delay)
end
3 運行結果
4 參考文獻
[1]趙睿智, and 丁云飛. "基于粒子群優化極限學習機的風功率預測." 上海電機學院學報 22.4(2019):6.
[2]郭城, 劉新忠, and 苗宇. "基于粒子群優化極限學習機的軋制力預測." 冶金自動化 45.S01(2021):4.
博主簡介:擅長智能優化算法、神經網絡預測、信號處理、元胞自動機、圖像處理、路徑規劃、無人機等多種領域的Matlab仿真,相關matlab代碼問題可私信交流。
部分理論引用網絡文獻,若有侵權聯系博主刪除。
總結
以上是生活随笔為你收集整理的【回归预测-ELM预测】基于粒子群算法PSO优化极限学习机预测附matlab代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTAP数据库及应用场景简析
- 下一篇: 用css3实现图片左右翻转