現(xiàn)灰色預(yù)測(cè)GM(1,1)模型:小樣本數(shù)據(jù)預(yù)測(cè)實(shí)戰(zhàn))
1. 項(xiàng)目概述從“黑箱”到“灰箱”的預(yù)測(cè)藝術(shù)在數(shù)據(jù)分析與預(yù)測(cè)的世界里我們常常面臨一個(gè)困境手頭的數(shù)據(jù)量少得可憐信息殘缺不全傳統(tǒng)的統(tǒng)計(jì)模型比如多元回歸、時(shí)間序列ARIMA因?yàn)閷?duì)數(shù)據(jù)分布、樣本量有嚴(yán)格要求往往直接“罷工”。這時(shí)候一個(gè)聽(tīng)起來(lái)有點(diǎn)“玄學(xué)”但實(shí)則非?!坝埠恕钡哪P途偷菆?chǎng)了——灰色預(yù)測(cè)模型。它不要求數(shù)據(jù)服從典型的概率分布不苛求大樣本甚至能處理信息部分已知、部分未知的“灰色”系統(tǒng)。我第一次接觸它是在一個(gè)供應(yīng)鏈需求預(yù)測(cè)項(xiàng)目里歷史銷售數(shù)據(jù)只有寥寥十幾條還夾雜著各種突發(fā)干擾用常規(guī)方法預(yù)測(cè)結(jié)果慘不忍睹。抱著試試看的心態(tài)用了灰色預(yù)測(cè)結(jié)果出人意料地貼合了后續(xù)幾個(gè)月的趨勢(shì)從此它就成了我應(yīng)對(duì)“小樣本、貧信息”預(yù)測(cè)問(wèn)題的秘密武器。今天我們就來(lái)徹底拆解這個(gè)模型并用Matlab這把“瑞士軍刀”把它從理論變成一行行可運(yùn)行的代碼讓你也能快速上手解決那些看似無(wú)解的數(shù)據(jù)預(yù)測(cè)難題。簡(jiǎn)單來(lái)說(shuō)灰色預(yù)測(cè)模型的核心思想是“生成”與“還原”。它認(rèn)為盡管原始數(shù)據(jù)序列可能雜亂無(wú)章、沒(méi)有明顯的規(guī)律但通過(guò)一次累加生成操作就能弱化其隨機(jī)性挖掘出潛在的指數(shù)增長(zhǎng)趨勢(shì)。然后對(duì)這個(gè)生成后的“干凈”序列建立微分方程模型即GM(1,1)模型最常用的一種預(yù)測(cè)其未來(lái)值最后再通過(guò)累減還原得到原始序列的預(yù)測(cè)值。整個(gè)過(guò)程就像給模糊的毛玻璃原始數(shù)據(jù)做了一次“積分”拋光使其下的圖案趨勢(shì)清晰可見(jiàn)我們描摹圖案后再通過(guò)“微分”操作還原回毛玻璃本身未來(lái)的樣子。它特別適合用于短期、趨勢(shì)性的預(yù)測(cè)比如年度用電量、商品月度銷量、傳染病初期病例數(shù)等。2. 灰色預(yù)測(cè)模型的核心原理與數(shù)學(xué)骨架要玩轉(zhuǎn)一個(gè)模型死記硬背公式不如理解其內(nèi)在邏輯?;疑A(yù)測(cè)GM(1,1)模型雖然公式看起來(lái)有點(diǎn)復(fù)雜但一步步拆解下來(lái)你會(huì)發(fā)現(xiàn)它的設(shè)計(jì)非常巧妙。2.1 為什么是“灰色”系統(tǒng)論的視角在控制論和系統(tǒng)科學(xué)里我們根據(jù)信息的明確程度把系統(tǒng)分為三類白色系統(tǒng)信息完全明確。比如一個(gè)已知所有參數(shù)和結(jié)構(gòu)的電路其輸出輸入關(guān)系完全清楚。黑色系統(tǒng)信息完全未知。就像一個(gè)完全密封的黑箱只知道輸入輸出內(nèi)部機(jī)理一無(wú)所知。灰色系統(tǒng)信息部分明確、部分未知。這才是現(xiàn)實(shí)世界的常態(tài)。我們知道一些影響因素但無(wú)法窮盡所有我們有部分歷史數(shù)據(jù)但不足以描繪全貌?;疑A(yù)測(cè)模型就是專門(mén)為這類系統(tǒng)設(shè)計(jì)的。2.2 GM(1,1)模型建模五步法我們以一個(gè)簡(jiǎn)單的序列為例假設(shè)我們有某產(chǎn)品過(guò)去5個(gè)月的銷售額單位萬(wàn)元X??? [2.874, 3.278, 3.337, 3.390, 3.679]。這里的上標(biāo)(0)表示原始序列。第一步數(shù)據(jù)檢驗(yàn)與預(yù)處理在建模前必須檢查序列的級(jí)比。級(jí)比 λ(k) x???(k-1) / x???(k)其中k2,3,...,n。所有級(jí)比必須落在可容覆蓋區(qū)間(e^(-2/(n1)), e^(2/(n1)))內(nèi)模型才有意義。對(duì)于n5這個(gè)區(qū)間大約是(0.7165, 1.3956)。計(jì)算我們的數(shù)據(jù)級(jí)比3.278/2.874≈1.140 3.337/3.278≈1.018 3.390/3.337≈1.016 3.679/3.390≈1.085全部落在區(qū)間內(nèi)說(shuō)明數(shù)據(jù)適合建立GM(1,1)模型。如果有個(gè)別點(diǎn)超出可能需要進(jìn)行平移或刪除等預(yù)處理。第二步一次累加生成1-AGO這是灰色預(yù)測(cè)的“靈魂操作”。累加生成序列X?1?其中x?1?(k) Σ_{i1}^k x???(i)。 計(jì)算得到X?1? [2.874, 2.8743.2786.152, 6.1523.3379.489, 9.4893.39012.879, 12.8793.67916.558]累加后的序列X?1?會(huì)呈現(xiàn)出明顯的增長(zhǎng)趨勢(shì)隨機(jī)波動(dòng)被大大平滑更接近指數(shù)規(guī)律。你可以把它想象成把每個(gè)月新增的銷售額不斷累加起來(lái)得到的是截至當(dāng)月的總銷售額這個(gè)總量曲線自然比月度數(shù)據(jù)平滑得多。第三步構(gòu)建灰微分方程與白化方程GM(1,1)模型的基本形式是灰微分方程x???(k) a*z?1?(k) b。 這里x???(k)是原始序列的第k個(gè)值。z?1?(k)是背景值通常取為緊鄰均生成數(shù)即z?1?(k) 0.5 * [x?1?(k) x?1?(k-1)]。例如z?1?(2) 0.5*(6.1522.874)4.513。a稱為發(fā)展系數(shù)反映序列X?1?的增長(zhǎng)速度。b稱為灰色作用量可以理解為內(nèi)生驅(qū)動(dòng)項(xiàng)。這個(gè)方程對(duì)應(yīng)的白化方程即連續(xù)的微分方程為dx?1?/dt a*x?1? b。我們的目標(biāo)就是求解參數(shù)a和b。第四步參數(shù)估計(jì)最小二乘法將灰微分方程x???(k) -a*z?1?(k) b看作一個(gè)線性方程。令Y [x???(2), x???(3), ..., x???(n)]^TB [[-z?1?(2), 1]; [-z?1?(3), 1]; ...; [-z?1?(n), 1]]U [a; b]。 則方程組簡(jiǎn)化為Y B * U。利用最小二乘法求得參數(shù)向量的估計(jì)值為U_hat [a; b] (B^T * B)^(-1) * B^T * Y。 這是我們整個(gè)模型計(jì)算的核心。代入我們的數(shù)據(jù)Y [3.278; 3.337; 3.390; 3.679] B [[-4.513, 1]; [-7.820, 1]; [-11.184, 1]; [-14.719, 1]]通過(guò)計(jì)算后面用Matlab實(shí)現(xiàn)我們可以得到a和b的估計(jì)值。第五步模型求解與預(yù)測(cè)解出參數(shù)后白化方程dx?1?/dt a*x?1? b的解時(shí)間響應(yīng)函數(shù)為x??1?(t) [x???(1) - b/a] * e^(-a*(t-1)) b/a將離散時(shí)間點(diǎn)k代入得到累加序列的預(yù)測(cè)值x??1?(k1) [x???(1) - b/a] * e^(-a*k) b/a 其中k0,1,2,...第六步累減還原I-AGO得到最終預(yù)測(cè)將累加預(yù)測(cè)值還原為原始序列的預(yù)測(cè)值x????(k1) x??1?(k1) - x??1?(k) 其中定義x??1?(0)0。 特別地x????(1) x???(1)。注意很多初學(xué)者在這里會(huì)混淆k的取值。在預(yù)測(cè)公式x??1?(k1)中k代表的是從起始點(diǎn)開(kāi)始經(jīng)過(guò)的“步數(shù)”。k0對(duì)應(yīng)第一個(gè)原始數(shù)據(jù)點(diǎn)x???(1)的時(shí)刻其累加值就是它本身。k1對(duì)應(yīng)第二個(gè)原始數(shù)據(jù)點(diǎn)的預(yù)測(cè)時(shí)刻以此類推。建模時(shí)我們用k0,1,...,n-1來(lái)擬合已知數(shù)據(jù)用kn, n1, ...來(lái)進(jìn)行未來(lái)預(yù)測(cè)。3. Matlab實(shí)戰(zhàn)從零手寫(xiě)GM(1,1)預(yù)測(cè)函數(shù)理解了數(shù)學(xué)原理用Matlab實(shí)現(xiàn)就是水到渠成。我們不依賴模糊的第三方工具箱而是自己動(dòng)手從零構(gòu)建一個(gè)健壯、可復(fù)用的GM(1,1)預(yù)測(cè)函數(shù)。這將讓你對(duì)每一個(gè)計(jì)算環(huán)節(jié)都了如指掌。3.1 函數(shù)設(shè)計(jì)與框架首先我們規(guī)劃函數(shù)的功能輸入原始數(shù)據(jù)序列和需要預(yù)測(cè)的步數(shù)輸出預(yù)測(cè)值、模型參數(shù)、以及擬合效果評(píng)價(jià)指標(biāo)。function [predict, a, b, relative_errors, C, P] my_gm11(x0, predict_step) % MY_GM11 自定義GM(1,1)灰色預(yù)測(cè)模型 % 輸入 % x0: 原始數(shù)據(jù)行向量例如 [2.874, 3.278, 3.337, 3.390, 3.679] % predict_step: 需要向后預(yù)測(cè)的步數(shù) % 輸出 % predict: 預(yù)測(cè)值包括歷史擬合值和未來(lái)預(yù)測(cè)值長(zhǎng)度 length(x0)predict_step % a: 發(fā)展系數(shù) % b: 灰色作用量 % relative_errors: 歷史數(shù)據(jù)擬合相對(duì)誤差百分比向量 % C: 后驗(yàn)差比值 % P: 小誤差概率 n length(x0); % 1. 數(shù)據(jù)級(jí)比檢驗(yàn) lambda x0(1:end-1) ./ x0(2:end); % 注意這里是前/后 range exp([-2/(n1), 2/(n1)]); if any(lambda range(1)) || any(lambda range(2)) warning(部分級(jí)比未落在可容覆蓋區(qū)間內(nèi)模型精度可能受限。); % 在實(shí)際應(yīng)用中這里可以添加數(shù)據(jù)平移處理代碼 end % 2. 一次累加生成(1-AGO) x1 cumsum(x0); % 3. 計(jì)算背景值z(mì)1 (緊鄰均值生成) z1 (x1(1:end-1) x1(2:end)) / 2; % 4. 構(gòu)造矩陣B和Y利用最小二乘法求解參數(shù)a, b Y x0(2:end); B [-z1, ones(n-1, 1)]; U (B * B) \ (B * Y); % 等價(jià)于 pinv(B)*Y更穩(wěn)定 a U(1); b U(2); % 5. 計(jì)算累加序列的擬合值 x1_fit % 時(shí)間響應(yīng)函數(shù): x1_fit(k1) (x0(1)-b/a)*exp(-a*k) b/a k 0:(n-1predict_step); % 覆蓋歷史擬合和未來(lái)預(yù)測(cè) x1_fit (x0(1) - b/a) * exp(-a * k) b/a; % 6. 累減還原得到原始序列的擬合/預(yù)測(cè)值 x0_fit x0_fit zeros(1, length(k)); x0_fit(1) x0(1); % 第一個(gè)值就是原始值 for i 2:length(x0_fit) x0_fit(i) x1_fit(i) - x1_fit(i-1); % I-AGO end predict x0_fit; % 7. 計(jì)算歷史擬合誤差和模型評(píng)價(jià)指標(biāo) % 歷史擬合部分 fitted_historical x0_fit(1:n); absolute_errors x0 - fitted_historical; relative_errors abs(absolute_errors) ./ x0 * 100; % 相對(duì)誤差百分比 % 計(jì)算后驗(yàn)差比值C和小誤差概率P S1 std(x0); % 原始序列標(biāo)準(zhǔn)差 residual absolute_errors; avg_residual mean(residual); S2 std(residual); % 殘差標(biāo)準(zhǔn)差 C S2 / S1; % 后驗(yàn)差比值 % 計(jì)算小誤差概率 delta abs(residual - avg_residual); P sum(delta 0.6745 * S1) / n; % 0.6745是常用系數(shù) end這個(gè)函數(shù)已經(jīng)包含了完整的建模、預(yù)測(cè)和初步評(píng)估流程。接下來(lái)我們用一個(gè)腳本調(diào)用它并可視化結(jié)果。3.2 完整腳本示例與結(jié)果可視化我們使用之前的銷售額數(shù)據(jù)預(yù)測(cè)未來(lái)2個(gè)月的銷售額。% 清空環(huán)境 clear; clc; close all; % 1. 輸入原始數(shù)據(jù) x0 [2.874, 3.278, 3.337, 3.390, 3.679]; predict_step 2; % 預(yù)測(cè)未來(lái)2期 % 2. 調(diào)用自定義灰色預(yù)測(cè)函數(shù) [predict, a, b, relative_errors, C, P] my_gm11(x0, predict_step); % 3. 輸出結(jié)果 fprintf(發(fā)展系數(shù) a %.6f\n, a); fprintf(灰色作用量 b %.6f\n, b); fprintf(\n歷史數(shù)據(jù)擬合情況\n); for i 1:length(x0) fprintf( 第%d期: 實(shí)際值%.3f, 擬合值%.3f, 相對(duì)誤差%.2f%%\n, ... i, x0(i), predict(i), relative_errors(i)); end fprintf(\n未來(lái)%d期預(yù)測(cè)值\n, predict_step); for i 1:predict_step fprintf( 第%d期: %.3f\n, length(x0)i, predict(length(x0)i)); end % 4. 模型精度評(píng)價(jià) fprintf(\n 模型精度評(píng)價(jià) \n); fprintf(后驗(yàn)差比值 C %.4f\n, C); fprintf(小誤差概率 P %.4f\n, P); % 根據(jù)常用評(píng)價(jià)標(biāo)準(zhǔn)判斷 if (C 0.35 P 0.95) grade 優(yōu)秀 (Good); elseif (C 0.5 P 0.8) grade 合格 (Qualified); elseif (C 0.65 P 0.7) grade 勉強(qiáng)合格 (Barely Qualified); else grade 不合格 (Unqualified); end fprintf(模型精度等級(jí): %s\n, grade); % 5. 繪制對(duì)比圖 figure(Position, [100, 100, 900, 500]); subplot(1,2,1); k_historical 1:length(x0); k_predict (length(x0)1):(length(x0)predict_step); plot(k_historical, x0, bo-, LineWidth, 1.5, MarkerSize, 8, DisplayName, 實(shí)際值); hold on; plot(k_historical, predict(1:length(x0)), rs--, LineWidth, 1.5, MarkerSize, 8, DisplayName, 擬合值); plot(k_predict, predict(length(x0)1:end), r^--, LineWidth, 1.5, MarkerSize, 10, DisplayName, 預(yù)測(cè)值); xlabel(期數(shù)); ylabel(銷售額 (萬(wàn)元)); title(GM(1,1)模型擬合與預(yù)測(cè)結(jié)果); legend(Location, best); grid on; subplot(1,2,2); bar(k_historical, relative_errors); xlabel(期數(shù)); ylabel(相對(duì)誤差 (%)); title(歷史數(shù)據(jù)擬合相對(duì)誤差); grid on; ylim([0, max(relative_errors)*1.2]); for i 1:length(relative_errors) text(k_historical(i), relative_errors(i)0.1, sprintf(%.2f%%, relative_errors(i)), ... HorizontalAlignment, center, FontSize, 9); end sgtitle([灰色預(yù)測(cè)模型GM(1,1)分析 (a, num2str(a, %.4f), , b, num2str(b, %.4f), )]);運(yùn)行這段代碼你將在命令窗口看到詳細(xì)的數(shù)值結(jié)果并彈出一張包含擬合預(yù)測(cè)曲線和誤差柱狀圖的專業(yè)圖表。通過(guò)C和P值你可以定量判斷這個(gè)模型對(duì)于當(dāng)前數(shù)據(jù)是否可靠。實(shí)操心得在Matlab中矩陣運(yùn)算(B * B) \ (B * Y)是求解最小二乘參數(shù)的核心。我強(qiáng)烈建議使用反斜杠運(yùn)算符\或pinv(B)*Y而不是直接計(jì)算inv(B*B)*B*Y因?yàn)榍罢咴跀?shù)值計(jì)算上更穩(wěn)定特別是當(dāng)B接近病態(tài)矩陣時(shí)。這是從無(wú)數(shù)次的“NaN”或“Inf”報(bào)錯(cuò)中總結(jié)出的經(jīng)驗(yàn)。4. 模型檢驗(yàn)、優(yōu)化與高級(jí)話題一個(gè)模型建好了預(yù)測(cè)值也出來(lái)了但事情遠(yuǎn)沒(méi)有結(jié)束。模型靠譜嗎除了看預(yù)測(cè)值我們還需要一套系統(tǒng)的檢驗(yàn)方法?;疑A(yù)測(cè)有一套獨(dú)特的“后驗(yàn)差檢驗(yàn)”方法我們?cè)诤瘮?shù)里已經(jīng)計(jì)算了C和P。4.1 精度檢驗(yàn)詳解相對(duì)誤差檢驗(yàn)最直觀。我們函數(shù)輸出的relative_errors就是。通常要求平均相對(duì)誤差小于某個(gè)閾值如5%或10%具體看應(yīng)用場(chǎng)景的容忍度。后驗(yàn)差檢驗(yàn)這是灰色模型的特色檢驗(yàn)。后驗(yàn)差比值 CC S2 / S1。S1是原始序列標(biāo)準(zhǔn)差代表原始數(shù)據(jù)的波動(dòng)幅度S2是殘差標(biāo)準(zhǔn)差代表模型預(yù)測(cè)的波動(dòng)幅度。C越小說(shuō)明預(yù)測(cè)誤差的波動(dòng)相對(duì)于原始數(shù)據(jù)波動(dòng)越小模型越好。一般C 0.35為優(yōu)0.35 C 0.5為合格0.5 C 0.65為勉強(qiáng)合格C 0.65為不合格。小誤差概率 PP p{ |e(k)-ē| 0.6745*S1 }。它衡量的是殘差與殘差均值的偏差落在指定范圍內(nèi)的概率。P越大越好通常P 0.95為優(yōu) 0.8為合格。這兩個(gè)指標(biāo)結(jié)合就形成了我們代碼中的四檔評(píng)價(jià)標(biāo)準(zhǔn)。它們從不同角度衡量了模型的擬合精度和穩(wěn)定性。4.2 模型不理想怎么辦常見(jiàn)優(yōu)化策略如果你的模型檢驗(yàn)不合格C值過(guò)大或P值過(guò)小或者預(yù)測(cè)結(jié)果明顯不合理別急著放棄??梢試L試以下優(yōu)化策略數(shù)據(jù)預(yù)處理平移變換如果原始數(shù)據(jù)有負(fù)數(shù)或零GM(1,1)可能失效因?yàn)榧?jí)比計(jì)算和指數(shù)函數(shù)對(duì)正數(shù)友好??梢詫?duì)所有數(shù)據(jù)加上一個(gè)常數(shù)c使其全部為正建模預(yù)測(cè)后再減去c。這個(gè)常數(shù)c的選取有技巧一般取|min(x0)| 1或通過(guò)試錯(cuò)確定。對(duì)數(shù)變換或方根變換如果數(shù)據(jù)波動(dòng)劇烈可以先進(jìn)行平滑變換弱化極端值的影響建模后再反變換回來(lái)。背景值構(gòu)造優(yōu)化 標(biāo)準(zhǔn)GM(1,1)使用緊鄰均值z(mì)?1?(k)0.5*(x?1?(k)x?1?(k-1))。研究表明這并非最優(yōu)??梢砸霗?quán)重系數(shù)α構(gòu)造z?1?(k)α*x?1?(k) (1-α)*x?1?(k-1)并通過(guò)智能算法如粒子群、遺傳算法優(yōu)化α值以最小化預(yù)測(cè)誤差。這被稱為優(yōu)化背景值的GM(1,1)模型。殘差修正 如果原始GM(1,1)模型的殘差序列e??? x??? - x????本身具有一定的規(guī)律性可通過(guò)級(jí)比檢驗(yàn)判斷可以對(duì)殘差序列再建立一個(gè)GM(1,1)模型用這個(gè)殘差模型的預(yù)測(cè)值去修正原始模型的預(yù)測(cè)值。這能有效提高精度尤其是當(dāng)原始序列存在波動(dòng)時(shí)。使用其他灰色模型 GM(1,1)是基礎(chǔ)。對(duì)于更復(fù)雜的序列可以考慮DGM(1,1)模型離散灰色模型直接針對(duì)離散序列建模有時(shí)精度更高。GM(1,N)模型考慮1個(gè)主行為序列和N個(gè)相關(guān)因素序列的多元灰色模型適用于有外部驅(qū)動(dòng)因素的情況。Verhulst模型適用于具有飽和狀態(tài)S型曲線的序列預(yù)測(cè)如人口增長(zhǎng)、產(chǎn)品生命周期等。4.3 在Matlab中集成優(yōu)化與殘差修正下面我們演示一個(gè)簡(jiǎn)單的“殘差修正GM(1,1)”的實(shí)現(xiàn)思路function [predict_final] gm11_residual_correction(x0, predict_step) % 帶殘差修正的GM(1,1)模型 % 第一步建立原始GM(1,1)模型 [predict0, a0, b0, ~, ~, ~] my_gm11(x0, predict_step); fitted0 predict0(1:length(x0)); % 原始模型的歷史擬合值 residual0 x0 - fitted0; % 計(jì)算殘差序列 % 第二步檢驗(yàn)殘差序列是否適合建模這里簡(jiǎn)單判斷其級(jí)比 lambda_res residual0(1:end-1) ./ residual0(2:end); n_res length(residual0); range_res exp([-2/(n_res1), 2/(n_res1)]); suitable_for_modeling all(lambda_res range_res(1)) all(lambda_res range_res(2)); if suitable_for_modeling abs(mean(residual0)) 0.01*mean(abs(x0)) % 如果殘差序列級(jí)比可容且均值不為零有一定信息量則對(duì)其建模 % 注意殘差可能包含正負(fù)需要先平移 c abs(min(residual0)) 0.1; % 平移常數(shù)確保全為正 residual_positive residual0 c; % 對(duì)平移后的正殘差建立GM(1,1)模型預(yù)測(cè)未來(lái)殘差 [predict_res, ~, ~] my_gm11(residual_positive, predict_step); fitted_res predict_res(1:length(residual_positive)); future_res predict_res(length(residual_positive)1:end) - c; % 預(yù)測(cè)的未來(lái)殘差記得減回c % 第三步修正原始預(yù)測(cè)值 predict_final predict0; predict_final(1:length(x0)) fitted0 (fitted_res - c); % 修正歷史擬合值 predict_final(length(x0)1:end) predict0(length(x0)1:end) future_res; % 修正未來(lái)預(yù)測(cè)值 else % 如果殘差不適合建模則返回原始預(yù)測(cè)結(jié)果 fprintf(殘差序列不適合建立GM(1,1)模型返回原始預(yù)測(cè)結(jié)果。\n); predict_final predict0; end end這個(gè)函數(shù)展示了如何將殘差序列也納入建??蚣?。在實(shí)際應(yīng)用中優(yōu)化背景值系數(shù)α通常能帶來(lái)更穩(wěn)定的提升但需要結(jié)合優(yōu)化算法這里不展開(kāi)。5. 灰色預(yù)測(cè)的典型應(yīng)用場(chǎng)景與局限經(jīng)過(guò)前面的理論推導(dǎo)和Matlab實(shí)戰(zhàn)你應(yīng)該已經(jīng)掌握了灰色預(yù)測(cè)的基本功。最后我們來(lái)聊聊它的用武之地和邊界在哪里這能幫助你在實(shí)際項(xiàng)目中做出正確的選擇。5.1 哪些場(chǎng)景特別適合用灰色預(yù)測(cè)數(shù)據(jù)稀缺的場(chǎng)景這是灰色預(yù)測(cè)最大的優(yōu)勢(shì)。當(dāng)你只有4、5個(gè)到十幾個(gè)數(shù)據(jù)點(diǎn)時(shí)很多統(tǒng)計(jì)模型根本無(wú)法啟動(dòng)而灰色預(yù)測(cè)卻能給出一個(gè)趨勢(shì)性的參考。比如新產(chǎn)品上市初期的銷量預(yù)估、某個(gè)新政策實(shí)施后頭幾個(gè)月的效果評(píng)估。趨勢(shì)外推預(yù)測(cè)適用于呈現(xiàn)明顯增長(zhǎng)或衰減趨勢(shì)的短期預(yù)測(cè)通常預(yù)測(cè)步數(shù)不超過(guò)序列長(zhǎng)度的1/2。例如能源領(lǐng)域年度電力負(fù)荷預(yù)測(cè)、城市燃?xì)庥昧款A(yù)測(cè)。經(jīng)濟(jì)領(lǐng)域季度GDP增速預(yù)測(cè)、區(qū)域財(cái)政收入預(yù)測(cè)。工業(yè)領(lǐng)域設(shè)備故障率預(yù)測(cè)、原材料消耗預(yù)測(cè)。環(huán)境領(lǐng)域城市空氣質(zhì)量指數(shù)AQI短期預(yù)測(cè)、河流污染物濃度預(yù)測(cè)。作為組合預(yù)測(cè)的組成部分在復(fù)雜的預(yù)測(cè)系統(tǒng)中單一模型往往有偏??梢詫⒒疑A(yù)測(cè)的結(jié)果與線性回歸、指數(shù)平滑甚至機(jī)器學(xué)習(xí)模型的預(yù)測(cè)結(jié)果進(jìn)行加權(quán)組合利用其在小樣本趨勢(shì)捕捉上的優(yōu)勢(shì)提升整體預(yù)測(cè)的魯棒性。5.2 灰色預(yù)測(cè)的局限性及注意事項(xiàng)沒(méi)有任何一個(gè)模型是萬(wàn)能的灰色預(yù)測(cè)的局限性同樣明顯使用時(shí)必須心中有數(shù)僅適用于指數(shù)趨勢(shì)序列GM(1,1)模型的解是指數(shù)形式因此它本質(zhì)上最適合擬合和預(yù)測(cè)呈指數(shù)規(guī)律變化的數(shù)據(jù)。對(duì)于周期性波動(dòng)、隨機(jī)波動(dòng)占主導(dǎo)或趨勢(shì)發(fā)生轉(zhuǎn)折的序列其預(yù)測(cè)效果會(huì)很差甚至完全錯(cuò)誤。在建模前務(wù)必繪制序列散點(diǎn)圖觀察其大致趨勢(shì)。短期預(yù)測(cè)有效長(zhǎng)期預(yù)測(cè)慎用灰色模型對(duì)近期數(shù)據(jù)的擬合較好但隨著預(yù)測(cè)步長(zhǎng)的增加誤差會(huì)呈指數(shù)級(jí)放大。通常建議預(yù)測(cè)期不超過(guò)原始序列長(zhǎng)度。千萬(wàn)不要用它去做長(zhǎng)達(dá)數(shù)十期的“遠(yuǎn)景規(guī)劃”。對(duì)異常值敏感由于模型基于累加生成一個(gè)異常的“跳點(diǎn)”數(shù)據(jù)會(huì)被累積到后續(xù)所有數(shù)據(jù)中嚴(yán)重影響背景值和參數(shù)估計(jì)。建模前進(jìn)行數(shù)據(jù)清洗識(shí)別并處理異常值至關(guān)重要?!盎摇辈淮怼靶彪m然模型對(duì)數(shù)據(jù)要求低但其參數(shù)a和b具有明確的物理意義發(fā)展速度和內(nèi)生驅(qū)動(dòng)。如果求出的a值在正負(fù)號(hào)或量級(jí)上與實(shí)際情況嚴(yán)重不符那么預(yù)測(cè)結(jié)果很可能沒(méi)有意義。每次建模后都要結(jié)合業(yè)務(wù)常識(shí)審視一下參數(shù)。模型檢驗(yàn)不可省略絕對(duì)不能只看預(yù)測(cè)值必須進(jìn)行相對(duì)誤差檢驗(yàn)和后驗(yàn)差檢驗(yàn)。一個(gè)C0.65且P0.7的模型其預(yù)測(cè)結(jié)果幾乎沒(méi)有參考價(jià)值。我們的Matlab函數(shù)已經(jīng)內(nèi)置了這些檢驗(yàn)請(qǐng)務(wù)必查看并理解輸出結(jié)果。踩坑實(shí)錄我曾在一個(gè)項(xiàng)目中用過(guò)去6年的年度數(shù)據(jù)預(yù)測(cè)未來(lái)1年效果很好。業(yè)務(wù)方看到后興奮地要求直接預(yù)測(cè)未來(lái)5年。我雖然知道有風(fēng)險(xiǎn)但還是做了。結(jié)果第三年的預(yù)測(cè)值就開(kāi)始嚴(yán)重偏離實(shí)際后來(lái)發(fā)現(xiàn)行業(yè)周期到了拐點(diǎn)。這次經(jīng)歷讓我深刻理解灰色預(yù)測(cè)是“趨勢(shì)的放大器”而不是“規(guī)律的發(fā)現(xiàn)者”。當(dāng)內(nèi)在規(guī)律發(fā)生變化時(shí)它無(wú)法感知。所以現(xiàn)在我在交付任何灰色預(yù)測(cè)結(jié)果時(shí)都會(huì)醒目地標(biāo)注“本預(yù)測(cè)基于歷史趨勢(shì)外推適用于短期長(zhǎng)期預(yù)測(cè)請(qǐng)結(jié)合行業(yè)專家判斷”。6. 在Matlab生態(tài)中拓展與資源雖然我們手寫(xiě)了核心代碼但Matlab強(qiáng)大的生態(tài)中也有相關(guān)工具可以參考和學(xué)習(xí)。系統(tǒng)辨識(shí)工具箱雖然不直接提供灰色模型但其處理時(shí)間序列和參數(shù)估計(jì)的思想是相通的。曲線擬合工具箱你可以用自定義方程y (x0(1)-b/a)*exp(-a*(x-1)) b/a去擬合累加序列x1這本質(zhì)上就是在解灰色模型的參數(shù)并提供豐富的擬合優(yōu)度統(tǒng)計(jì)量。文件交換社區(qū)在MathWorks File Exchange中搜索 “Grey Prediction” 或 “GM(1,1)”可以找到其他開(kāi)發(fā)者分享的更加完善、帶有GUI界面的工具箱可以作為學(xué)習(xí)和對(duì)比的參考。但理解了我們自己手寫(xiě)的代碼再看這些工具箱就會(huì)一目了然。最后我個(gè)人在實(shí)際操作中的體會(huì)是灰色預(yù)測(cè)模型更像是一把“應(yīng)急鑰匙”或“輔助透鏡”。它不能解決所有預(yù)測(cè)問(wèn)題但在數(shù)據(jù)匱乏、急需一個(gè)趨勢(shì)性指引的初期階段它的簡(jiǎn)單、高效和一定程度的可靠性往往能帶來(lái)意想不到的價(jià)值。關(guān)鍵是要清楚它的假設(shè)、熟練它的流程、嚴(yán)謹(jǐn)?shù)剡M(jìn)行檢驗(yàn)并明確告知使用者其局限性。把這套從原理到Matlab實(shí)現(xiàn)再到檢驗(yàn)優(yōu)化的流程走通你就能在遇到那些“數(shù)據(jù)少、時(shí)間緊、要結(jié)果”的預(yù)測(cè)任務(wù)時(shí)從容地多出一個(gè)可靠的選擇。