粒子群優(yōu)化LSSVM的短期電力負(fù)荷預(yù)測(cè)Matlab實(shí)現(xiàn)與參數(shù)調(diào)優(yōu))
簡(jiǎn)介基于改進(jìn)粒子群優(yōu)化最小二乘支持向量機(jī)LSSVM的短期電力負(fù)荷預(yù)測(cè)MATLAB實(shí)現(xiàn)配備可視化GUI界面主要面向計(jì)算機(jī)、電子信息工程、數(shù)學(xué)等專業(yè)的大學(xué)生適用于課程設(shè)計(jì)、期末大作業(yè)和畢業(yè)設(shè)計(jì)場(chǎng)景也適合剛接觸預(yù)測(cè)建模的MATLAB新手。壓縮包共包含38個(gè)文件以19個(gè).m源碼文件為骨架覆蓋粒子群初始化、適應(yīng)度計(jì)算、LSSVM訓(xùn)練與預(yù)測(cè)等核心流程同時(shí)提供3個(gè).mat數(shù)據(jù)文件、Excel表格數(shù)據(jù)、GUI的.fig界面、PNG/JPG示意圖以及PDF和Markdown說明文檔整體僅1.23MB結(jié)構(gòu)清晰便于按需查看。資源已有45人學(xué)習(xí)瀏覽附贈(zèng)可直接運(yùn)行的案例數(shù)據(jù)在MATLAB 2014/2019a/2024a下均可運(yùn)行。代碼采用參數(shù)化編程注釋詳細(xì)、關(guān)鍵參數(shù)可方便修改替換數(shù)據(jù)即可使用文檔中還梳理了改進(jìn)粒子群與LSSVM結(jié)合的思路與步驟能幫助讀者快速復(fù)現(xiàn)短期電力負(fù)荷預(yù)測(cè)實(shí)驗(yàn)并在此基礎(chǔ)上進(jìn)行算法改進(jìn)與結(jié)果分析。1. 短期電力負(fù)荷預(yù)測(cè)的LSSVM方案這份Matlab資源到底解決什么問題短期電力負(fù)荷預(yù)測(cè)就是提前把下一小時(shí)甚至未來24小時(shí)的用電負(fù)荷估出來。這事兒表面簡(jiǎn)單真做起來全是細(xì)節(jié)溫度突變、節(jié)假日效應(yīng)、不同區(qū)域的負(fù)荷曲線差異巨大傳統(tǒng)回歸模型一遇到非線性就翻車。最小二乘支持向量機(jī)LSSVM把標(biāo)準(zhǔn)SVM的二次規(guī)劃換成求解線性方程組訓(xùn)練速度快一個(gè)量級(jí)再用改進(jìn)的粒子群優(yōu)化PSO去搜正則化參數(shù)和核寬在小樣本場(chǎng)景下往往比BP網(wǎng)絡(luò)穩(wěn)得多。這份資源包正好把整條鏈路做完整改進(jìn)PSO尋優(yōu)、LSSVM訓(xùn)練預(yù)測(cè)、GUI交互界面、附帶的電力負(fù)荷數(shù)據(jù)Matlab 2014到2024a都能跑適合做課程設(shè)計(jì)、期末作業(yè)和畢業(yè)設(shè)計(jì)的讀者直接替換數(shù)據(jù)跑通。2. 從標(biāo)準(zhǔn)SVM到LSSVM改進(jìn)粒子群優(yōu)化的兩個(gè)關(guān)鍵參數(shù)與一個(gè)核心改進(jìn)點(diǎn)2.1 LSSVM和標(biāo)準(zhǔn)SVM的差別一個(gè)線性方程組的距離先說結(jié)論標(biāo)準(zhǔn)SVM解的是帶不等式約束的凸二次規(guī)劃樣本量一大SMO算法要迭代幾百輪才收斂LSSVM把不等式約束替換成等式約束把誤差平方放進(jìn)目標(biāo)函數(shù)KKT條件化簡(jiǎn)之后就是解一個(gè)(n1)×(n1)的線性方程組n是訓(xùn)練樣本數(shù)。電力負(fù)荷預(yù)測(cè)這種場(chǎng)景訓(xùn)練樣本一般幾百條矩陣求逆在Matlab里就是毫秒級(jí)的事。LSSVM用在這個(gè)場(chǎng)景的第一理由是快第二理由是精度上不比標(biāo)準(zhǔn)SVM差。短期負(fù)荷數(shù)據(jù)本身噪聲大標(biāo)準(zhǔn)SVM的稀疏性優(yōu)勢(shì)在強(qiáng)噪聲、小樣本的負(fù)荷預(yù)測(cè)里體現(xiàn)不出來反而是LSSVM的稠密解把所有樣本信息都用上了平滑性更好。代價(jià)是失去了稀疏性預(yù)測(cè)時(shí)每個(gè)樣本都要參與核函數(shù)計(jì)算但輸入維度只有幾十個(gè)點(diǎn)這點(diǎn)計(jì)算開銷無所謂。核函數(shù)上這份資源用的RBF核公式長(zhǎng)這樣K(xi, xj) exp( -||xi - xj||2 / (2·σ2) )σ就是核寬。σ選小了核矩陣對(duì)角線突出模型過擬合預(yù)測(cè)曲線跟著訓(xùn)練集抖σ選大了所有樣本的相似度都趨近于1模型變成近似線性又欠擬合。同樣的道理正則化參數(shù)γ控制經(jīng)驗(yàn)誤差和模型復(fù)雜度的平衡。γ太大訓(xùn)練誤差被壓得很低泛化能力下降γ太小模型過于平滑跟不上負(fù)荷的突變。這兩個(gè)參數(shù)就是PSO要搜的東西。代碼包里initlssvm.m的調(diào)用方式很能說明問題這是工具箱的標(biāo)準(zhǔn)寫法% initlssvm: 初始化LSSVM模型 % 參數(shù)依次為: 訓(xùn)練輸入X, 訓(xùn)練輸出Y, 類型type, % 正則化參數(shù)gam, 核寬sig2, 核函數(shù)類型 model initlssvm(train_X, train_Y, f, gam, sig2, RBF_kernel); % 然后直接訓(xùn)練 model trainlssvm(model);參數(shù)說明type位置的f表示函數(shù)回歸分類場(chǎng)景要改成cgam是γ正則化參數(shù)是PSO第一個(gè)待優(yōu)化量sig2是σ2核寬平方是第二個(gè)待優(yōu)化量。工具箱還提供線性核、多項(xiàng)式核等選項(xiàng)負(fù)荷預(yù)測(cè)場(chǎng)景基本都用RBF核換核函數(shù)會(huì)改變模型性能不建議新手動(dòng)。2.2 PSO為什么需要“改進(jìn)”慣性權(quán)重、學(xué)習(xí)因子和早熟問題標(biāo)準(zhǔn)PSO的速度-位置更新公式是v(i,d) ← w·v(i,d) c1·r1·(pbest(i,d) - x(i,d)) c2·r2·(gbest(d) - x(i,d)) x(i,d) ← x(i,d) v(i,d)三個(gè)核心參數(shù)分別是w慣性權(quán)重w大粒子飛得遠(yuǎn)、全局搜索強(qiáng)w小在局部精細(xì)搜索經(jīng)典做法是從0.9線性遞減到0.4c1、c2學(xué)習(xí)因子c1把粒子拉向個(gè)體歷史最優(yōu)c2拉向全局最優(yōu)一般取c1c22r1、r2是[0,1]均勻隨機(jī)數(shù)保證搜索隨機(jī)性。但只做這些跑兩三百代就會(huì)出現(xiàn)典型的早熟現(xiàn)象——種群所有粒子聚到局部最優(yōu)附近適應(yīng)度不再下降。電力負(fù)荷預(yù)測(cè)的目標(biāo)函數(shù)是非凸的還有滯后效應(yīng)PSO很容易陷進(jìn)某個(gè)平庸的坑。這個(gè)包里的gaijin.m主要就是處理這個(gè)問題。常見的改進(jìn)方向有三類A同學(xué)試過之后確認(rèn)這個(gè)包用的是變慣性權(quán)重加變異算子。第一是慣性權(quán)重非線性遞減不再單純線性從0.9到0.4而是每代根據(jù)粒子聚集程度動(dòng)態(tài)調(diào)整種群越集中w越大把粒子重新轟散。第二是變異操作每迭代一定代數(shù)以一定概率對(duì)全局最優(yōu)位置做一個(gè)隨機(jī)擾動(dòng)強(qiáng)迫算法跳出局部最優(yōu)。第三是用混沌序列初始化種群讓粒子初始分布更均勻減少隨機(jī)初始化帶來的偶然性。改進(jìn)PSO單步迭代的核心邏輯以gaijin.m的思路為例% 改進(jìn)粒子群?jiǎn)尾降疽?for d 1 : dim v(i,d) w * v(i,d) c1 * rand() * (pbest(i,d) - x(i,d)) ... c2 * rand() * (gbest(d) - x(i,d)); % 位置更新并限幅防止越界導(dǎo)致模型參數(shù)無意義 x(i,d) x(i,d) v(i,d); if x(i,d) ub(d), x(i,d) ub(d); end if x(i,d) lb(d), x(i,d) lb(d); end end % 變異每10代對(duì)gbest做一次隨機(jī)擾動(dòng) if mod(iter, 10) 0 idx randi(dim, 1, 1); gbest(idx) lb(idx) rand() * (ub(idx) - lb(idx)); end這里變異概率和觸發(fā)代數(shù)都可以在參數(shù)區(qū)直接改。注意變異位置如果選的是核寬σ變異幅值太大會(huì)直接讓模型變線性PSO適應(yīng)度曲線會(huì)出現(xiàn)尖峰——這是正常現(xiàn)象。適應(yīng)度曲線有尖峰說明變異強(qiáng)度合適如果完全平滑反而說明變異沒起作用。限幅的ub和lb由用戶預(yù)設(shè)γ的搜索范圍我一般設(shè)[1, 1000]σ2設(shè)[0.01, 100]太寬會(huì)浪費(fèi)時(shí)間太窄又可能漏掉最優(yōu)解。2.3 適應(yīng)度函數(shù)的設(shè)計(jì)不是只看訓(xùn)練誤差PSO要優(yōu)化的目標(biāo)函數(shù)在AdaptFunc1.m里。嚴(yán)格來說這個(gè)函數(shù)應(yīng)該返回交叉驗(yàn)證誤差或者驗(yàn)證集誤差而不是訓(xùn)練集誤差。很多新手把訓(xùn)練誤差當(dāng)適應(yīng)度最后訓(xùn)練誤差低到0.001測(cè)試誤差卻很大這就是過擬合。一個(gè)折中做法是把歷史數(shù)據(jù)切成訓(xùn)練段和驗(yàn)證段用尋優(yōu)得到的γ和σ訓(xùn)練再在驗(yàn)證段上算MAPE作為PSO的適應(yīng)度。如果數(shù)據(jù)量太少至少也要用最近一部分?jǐn)?shù)據(jù)做驗(yàn)證。我實(shí)際跑負(fù)荷預(yù)測(cè)時(shí)習(xí)慣用驗(yàn)證集MAPE加一個(gè)小的正則項(xiàng)防止PSO把γ推到極端值你可以直接在AdaptFunc1.m里改返回值的計(jì)算方式。3. 資源包結(jié)構(gòu)拆解九個(gè)核心文件與從數(shù)據(jù)到GUI的調(diào)用鏈路3.1 文件清單與職責(zé)劃分解壓之后會(huì)看到一堆.m、.fig和.xlsx文件初次打開容易懵。按職責(zé)可以分成四組第一組是LSSVM工具箱函數(shù)包括initlssvm.m、trainlssvm.m、simlssvm.m、prelssvm.m、postlssvm.m、kernel_matrix.m這六個(gè)是標(biāo)準(zhǔn)LSSVM工具箱文件不需要改它們的任務(wù)是從初始化到訓(xùn)練再到預(yù)測(cè)的完整鏈路第二組是PSO相關(guān)包括pso.m、BaseStepPso.m、gaijin.m、InitSwarm.m、AdaptFunc1.m其中g(shù)aijin.m是改進(jìn)后的迭代邏輯AdaptFunc1.m是適應(yīng)度函數(shù)第三組是主程序和GUIshorttime.m是命令行主程序gui.m和gui.fig是GUI界面及回調(diào)第四組是數(shù)據(jù)文件data1.xlsx、1.xlsx、a23.xls是電力負(fù)荷歷史數(shù)據(jù)iris.data和woadata.mat是兩個(gè)附帶的小數(shù)據(jù)集做算法驗(yàn)證用的。各文件的關(guān)鍵職責(zé)用下面這張表概括文件職責(zé)是否需要修改shorttime.m主程序串聯(lián)數(shù)據(jù)加載、歸一化、尋優(yōu)、訓(xùn)練、預(yù)測(cè)、繪圖是pso.m標(biāo)準(zhǔn)PSO入口調(diào)度初始化和迭代一般不改gaijin.m改進(jìn)PSO迭代核心變異與動(dòng)態(tài)權(quán)重可微調(diào)AdaptFunc1.m適應(yīng)度函數(shù)決定PSO搜什么建議改InitSwarm.m粒子群初始化定義搜索邊界可調(diào)邊界initlssvm.m / trainlssvm.m / simlssvm.mLSSVM建模、訓(xùn)練、預(yù)測(cè)否gui.m / gui.fig圖形界面與回調(diào)函數(shù)看需求data1.xlsx / a23.xls負(fù)荷歷史數(shù)據(jù)替換3.2 主程序shorttime.m的完整調(diào)用鏈路數(shù)據(jù)流是這樣走的先xlsread讀入data1.xlsx把負(fù)荷數(shù)據(jù)轉(zhuǎn)成行向量接著mapminmax做歸一化把數(shù)據(jù)壓到[0,1]區(qū)間然后pso.m開始尋優(yōu)內(nèi)部循環(huán)里不斷調(diào)用AdaptFunc1.m計(jì)算適應(yīng)度AdaptFunc1.m每次都會(huì)臨時(shí)調(diào)用initlssvm、trainlssvm和simlssvm相當(dāng)于每一次迭代都在訓(xùn)練一個(gè)LSSVM模型尋優(yōu)結(jié)束后返回最優(yōu)γ和σ最后用這兩個(gè)參數(shù)重新訓(xùn)練模型對(duì)測(cè)試集預(yù)測(cè)再反歸一化還原真實(shí)量綱畫圖。%% shorttime.m 核心流程節(jié)選 % 1. 加載數(shù)據(jù) data xlsread(data1.xlsx); load_data data(:, 2); % 第二列是負(fù)荷值第一列是時(shí)間編號(hào) % 2. 劃分訓(xùn)練集和測(cè)試集并歸一化 train_len 500; % 前500個(gè)點(diǎn)訓(xùn)練 train_data load_data(1 : train_len); test_data load_data(train_len 1 : end); [train_x, ps_train] mapminmax(train_data, 0, 1); % 3. PSO尋優(yōu)返回最優(yōu)gamma和sig2 [best_gam, best_sig2] pso(AdaptFunc1, ...); % 參數(shù)見pso.m注釋 % 4. 用最優(yōu)參數(shù)訓(xùn)練LSSVM并預(yù)測(cè) model initlssvm(train_x, train_y, f, best_gam, best_sig2, RBF_kernel); model trainlssvm(model); predict_y simlssvm(model, test_x); predict_y mapminmax(reverse, predict_y, ps_train);這里train_y怎么構(gòu)造是關(guān)鍵如果做單步預(yù)測(cè)train_y就是train_x向后平移一個(gè)時(shí)刻的序列如果做多步預(yù)測(cè)得構(gòu)造輸入矩陣把前k個(gè)時(shí)刻的負(fù)荷作為特征、第k1時(shí)刻作為標(biāo)簽。資源包里默認(rèn)是單步滾動(dòng)預(yù)測(cè)想改多步需要自己改輸入構(gòu)造段。3.3 GUI與后臺(tái)腳本的配合方式gui.fig是界面布局文件gui.m是回調(diào)函數(shù)兩者通過Tag屬性關(guān)聯(lián)。運(yùn)行g(shù)ui.m就自動(dòng)加載gui.fig并顯示界面界面上的“開始預(yù)測(cè)”按鈕回調(diào)會(huì)調(diào)用shorttime.m的核心邏輯。注意老版本Matlab里GUIDE創(chuàng)建的項(xiàng)目在2014上直接雙擊gui.fig就能打開編輯但2024a開始GUIDE被逐步邊緣化新版本直接運(yùn)行g(shù)ui.m通常還能用只是編輯器會(huì)提示兼容問題不影響執(zhí)行。4. 實(shí)戰(zhàn)運(yùn)行數(shù)據(jù)替換、參數(shù)修改與兩種啟動(dòng)方式4.1 替換自己的負(fù)荷數(shù)據(jù)格式對(duì)了才能跑通資源包附帶的數(shù)據(jù)文件列結(jié)構(gòu)比較簡(jiǎn)單第一列是時(shí)間序號(hào)第二列是負(fù)荷值。替換數(shù)據(jù)時(shí)把data1.xlsx打開B列全部換成你自己的歷史負(fù)荷數(shù)據(jù)即可A列時(shí)間序號(hào)可以留空代碼里只讀取data(:,2)。如果數(shù)據(jù)是豎著排的Excel時(shí)間在A列、負(fù)荷在B列直接把data1.xlsx的B列覆蓋就行。需要注意負(fù)荷數(shù)據(jù)的采樣間隔要和代碼里的設(shè)置一致原包默認(rèn)是小時(shí)級(jí)數(shù)據(jù)一天24個(gè)點(diǎn)如果你的數(shù)據(jù)是15分鐘級(jí)的訓(xùn)練集長(zhǎng)度、預(yù)測(cè)步長(zhǎng)都要跟著改。單位方面歸一化會(huì)把數(shù)據(jù)壓到[0,1]所以不需要關(guān)心原始數(shù)據(jù)是MW還是萬千瓦時(shí)反歸一化會(huì)自動(dòng)還原單位。但要注意如果原始數(shù)據(jù)里有負(fù)值或者0需要確認(rèn)負(fù)荷不存在負(fù)值否則mapminmax歸一化后會(huì)出現(xiàn)超出[0,1]區(qū)間的點(diǎn)某些老版本Matlab的LSSVM工具箱會(huì)產(chǎn)生NaN。4.2 五個(gè)必須手動(dòng)改的參數(shù)從訓(xùn)練集比例到PSO搜索邊界%% 參數(shù)區(qū)均在shorttime.m或pso.m頭部 train_len 500; % 訓(xùn)練集長(zhǎng)度根據(jù)你的數(shù)據(jù)總量調(diào)整 TEST_LEN 48; % 測(cè)試集長(zhǎng)度預(yù)測(cè)未來幾個(gè)時(shí)刻 N 30; % PSO種群數(shù)量 MAX_ITER 100; % 最大迭代次數(shù) C1 2; C2 2; % 學(xué)習(xí)因子一般不動(dòng) W_MAX 0.9; W_MIN 0.4; % 慣性權(quán)重上下限 UB [100, 10]; % gamma和sigma2的上界 LB [0.01, 0.01]; % gamma和sigma2的下界參數(shù)說明train_len決定了用多少歷史數(shù)據(jù)訓(xùn)練數(shù)據(jù)總量小就按總量的80%來取TEST_LEN是預(yù)測(cè)步數(shù)做短期預(yù)測(cè)通常取24或48代表預(yù)測(cè)未來一天或兩天N和MAX_ITER決定PSO搜索粒度和成本N30、迭代100次在幾百條數(shù)據(jù)上大約幾十秒數(shù)據(jù)量大時(shí)可適當(dāng)調(diào)小UB和LB是關(guān)鍵γ搜索上界設(shè)1000也行但容易讓PSO花大量時(shí)間在無意義的極端區(qū)域我一般把γ上界控制在100以內(nèi)σ2上界控制在10以內(nèi)收斂快很多。4.3 兩種運(yùn)行方式命令行快跑與GUI可視化第一種是直接運(yùn)行shorttime.m命令行窗口會(huì)打印每一代的適應(yīng)度變化跑完出三張圖訓(xùn)練集擬合圖、測(cè)試集預(yù)測(cè)圖、PSO收斂曲線圖。這張收斂曲線圖很關(guān)鍵如果曲線最后還在下降說明MAX_ITER不夠要加大迭代次數(shù)。第二種是運(yùn)行g(shù)ui.m界面彈出來后點(diǎn)“載入數(shù)據(jù)”選xlsx文件再點(diǎn)“開始預(yù)測(cè)”就會(huì)自動(dòng)執(zhí)行尋優(yōu)和訓(xùn)練。GUI方式的好處是可以在界面上直接改幾個(gè)核心參數(shù)不用反復(fù)開編輯器適合演示和給非技術(shù)背景的導(dǎo)師過目。注意GUI方式下如果數(shù)據(jù)文件路徑包含中文或者空格某些老版本Matlab的xlsread會(huì)讀不出來建議路徑保持純英文。5. 避坑與排查數(shù)據(jù)讀取、歸一化、早熟和GUI跨版本的五個(gè)實(shí)操記錄5.1 數(shù)據(jù)讀取類工作路徑與xlsx版本兩個(gè)高頻報(bào)錯(cuò)現(xiàn)象直接運(yùn)行shorttime.m報(bào)錯(cuò)提示找不到data1.xlsx。 原因代碼用的是相對(duì)路徑當(dāng)前工作目錄不在解壓文件夾里。 解決先cd到解壓目錄再運(yùn)行或者在shorttime.m頂部加一行拼接絕對(duì)路徑的代碼?,F(xiàn)象Matlab 2014上xlsread讀取xlsx文件返回全NaN或讀取失敗。 原因2014版本自帶的Excel導(dǎo)入組件對(duì)高版本xlsx兼容性差原資源包的xlsx可能是新版Office生成的。 解決用Excel把data1.xlsx另存為data1.xls或data1.csv再把代碼里的文件名改掉。CSV格式通用性最好跨版本不會(huì)出幺蛾子。現(xiàn)象數(shù)據(jù)讀進(jìn)來了但load_data長(zhǎng)度不對(duì)訓(xùn)練集和測(cè)試集切分錯(cuò)位。 原因xlsx里可能存在表頭或空行data(:,2)把表頭字符串讀成了NaN實(shí)際數(shù)據(jù)長(zhǎng)度比預(yù)期短。 解決數(shù)據(jù)文件里刪掉表頭或者用xlsread的第二個(gè)返回值區(qū)分?jǐn)?shù)值和文本代碼里只保留數(shù)值行。5.2 模型訓(xùn)練類歸一化維度、PSO早熟和過擬合現(xiàn)象預(yù)測(cè)曲線整體偏移形狀對(duì)但幅度差了好幾倍。 原因mapminmax歸一化默認(rèn)按行處理輸入數(shù)據(jù)是行向量但某處代碼把測(cè)試集當(dāng)列向量傳入反歸一化時(shí)維度錯(cuò)配。 解決統(tǒng)一所有數(shù)據(jù)都是行向量訓(xùn)練和預(yù)測(cè)時(shí)用同一個(gè)ps_train結(jié)構(gòu)體做反歸一化不要重新調(diào)用mapminmax生成新的ps?,F(xiàn)象PSO迭代到第幾十代適應(yīng)度曲線平了gbest再也沒變過。 原因早熟。種群聚在局部最優(yōu)附近變異算子沒觸發(fā)或變異概率設(shè)得太低。 解決確認(rèn)gaijin.m里的變異觸發(fā)條件把變異間隔從10代改成5代試一次或者把w_max調(diào)回0.9讓前期搜索更充分?,F(xiàn)象訓(xùn)練集擬合誤差極小測(cè)試集誤差很大。 原因適應(yīng)度函數(shù)用的是訓(xùn)練誤差PSO把γ推高導(dǎo)致過擬合。 解決改AdaptFunc1.m用驗(yàn)證集MAPE作為適應(yīng)度值驗(yàn)證集從訓(xùn)練集尾部切出一段專門做尋優(yōu)評(píng)估。5.3 運(yùn)行兼容類GUI在2024a上的三種兜底方案現(xiàn)象2024a上運(yùn)行g(shù)ui.m報(bào)GUIDE相關(guān)錯(cuò)誤界面打不開。 原因新版Matlab不再維護(hù)GUIDE老版本.fig的兼容層被移除了一部分。 解決第一優(yōu)先是運(yùn)行shorttime.m命令行版本功能和GUI完全一致只是沒有可視化界面第二是用openfig(gui.fig)手動(dòng)加載fig文件再調(diào)回調(diào)函數(shù)第三是花半天用App Designer重建一個(gè)界面回調(diào)邏輯可以直接復(fù)用gui.m里的函數(shù)體只是控件語法要改一下。實(shí)際課程設(shè)計(jì)場(chǎng)景里命令行版跑通加個(gè)截圖就足夠交差不用死磕GUI。6. 進(jìn)階驗(yàn)證用滾動(dòng)回測(cè)給預(yù)測(cè)誤差做“體檢”單次預(yù)測(cè)跑出來的誤差好看不代表模型真的穩(wěn)負(fù)荷數(shù)據(jù)有周期性周一和周末的負(fù)荷特性完全不同只拿一段數(shù)據(jù)做測(cè)試很可能碰巧撞上規(guī)律性強(qiáng)的那幾天。滾動(dòng)回測(cè)是檢驗(yàn)?zāi)P头€(wěn)定性的常用手段把歷史數(shù)據(jù)按時(shí)間窗切成多段每一段都重新訓(xùn)練、重新預(yù)測(cè)最后統(tǒng)計(jì)多次預(yù)測(cè)的平均誤差和誤差波動(dòng)范圍。%% 滾動(dòng)回測(cè)示意每次前進(jìn)24小時(shí)連續(xù)預(yù)測(cè)7天 horizon 24; % 每次預(yù)測(cè)未來24小時(shí) steps 7; % 連續(xù)滾動(dòng)7次 mape_list zeros(1, steps); for k 1 : steps % 訓(xùn)練集終點(diǎn)隨k前進(jìn) train_end total_len - (steps - k 1) * horizon; train_data load_data(1 : train_end); test_data load_data(train_end 1 : train_end horizon); % 歸一化、尋優(yōu)、訓(xùn)練、預(yù)測(cè)略去沿用shorttime.m邏輯 [best_gam, best_sig2] pso(AdaptFunc1, ...); model initlssvm(train_x, train_y, f, best_gam, best_sig2, RBF_kernel); model trainlssvm(model); y_pred simlssvm(model, test_x); % 計(jì)算本段MAPE mape_list(k) mean(abs(y_pred - test_data) ./ test_data) * 100; end fprintf(7天平均MAPE: %.2f%%\n, mean(mape_list)); fprintf(最大單日MAPE: %.2f%%\n, max(mape_list));如果7天的平均MAPE在3%以內(nèi)、最大單日MAPE不超過6%這份模型換到你的數(shù)據(jù)上就基本靠譜。如果某一天的MAPE突然飆到兩位數(shù)把當(dāng)天的真實(shí)負(fù)荷曲線調(diào)出來看大概率是遇到了節(jié)假日或者極端天氣——這類異常樣本應(yīng)該從訓(xùn)練集里剔除或者單獨(dú)建一個(gè)節(jié)假日修正模型。從那以后我每次拿到新的負(fù)荷預(yù)測(cè)資源都強(qiáng)制自己先跑一輪滾動(dòng)回測(cè)再下結(jié)論單次預(yù)測(cè)的誤差曲線看著再漂亮也騙不了連續(xù)回測(cè)的統(tǒng)計(jì)結(jié)果。希望這篇拆解能幫你把這套LSSVM預(yù)測(cè)資源真正跑通、改造成自己的東西。本文還有配套的精品資源點(diǎn)擊獲取