资讯动态

基于MATLAB的高斯过程回归天气预测与不确定性估计

发布时间:2026/10/21 17:17:40 来源:尧图企业网站定制
在接触高斯过程回归之前我做中短期天气预测主要依赖两类工具一类是ARIMA这类经典时间序列模型另一类是前馈神经网络。两者都能给出未来几天的温度曲线但有一个问题始终绕不开——它们只给一条预测线不给“这条线到底有多可信”。现实中做天气预测用户真正关心的往往是“明天最高温大概在哪个范围”“这个预报稳不稳”而不是一个冷冰冰的点。高斯过程回归GPR最大的吸引力就在这里它天然输出预测均值的同时还会给出完整的不确定性区间。这篇博文我会用MATLAB完整实现一个基于GPR的中短期天气预测项目包含可以直接跑的数据生成脚本、特征工程、模型训练、多步滚动预测、置信区间评估以及一个完整的GUI界面。适合刚接触GPR、想把它落地到实际气象时序场景中的读者也适合需要在项目中快速搭建一个可演示预测原型的工程师。1. 为什么天气预测我最终选定了高斯过程回归1.1 传统模型的两个痛点先说ARIMA。ARIMA对单变量时间序列很友好模型解释性强但它本质上假设数据来自一个线性的自回归过程。气温数据表面看平稳实际上包含年周期、季节子周期、缓慢气候趋势、短期波动几者叠加后很难用一个固定阶数的线性方程描述。ARIMA在短期1到3天预测上还能看一旦往后推误差会迅速累积而且它的预测区间几乎等宽完全无法体现“天气突变时不确定性应该变大”这一物理直觉。神经网络类模型则反过来。只要数据足够多拟合能力强点预测可以做得相当准但它需要大量训练数据调参而且预测区间是通过多次dropout或者集成方式近似得到的既不严谨也没有统一框架。更麻烦的是神经网络对输入特征的尺度变化极其敏感特征工程稍微不规范预测结果完全不可控。我在项目中试过几次能出图但每次换一段新数据就要重新调结构维护成本很高。1.2 GPR的优势与MATLAB的落地方式GPR走的是另一条路它不是直接学一个从特征到标签的确定性函数而是给“所有可能的函数”都赋予一个先验概率分布再根据观测数据更新这个分布最终得到预测点的后验均值与后验方差。关键点是输出的方差不是你事后加上的而是模型在训练阶段就从核函数和数据中推断出来的因此它的不确定性估计有概率论支撑。对小样本、高噪声、周期性强的气象数据GPR往往比神经网络更“省数据”几百个样本就能训练出一个合理可用的预测器。在MATLAB里落地GPR其实非常顺手统计和机器学习工具箱提供了完整的fitrgp函数集成了核函数选择、超参数优化、预测均值与标准差计算还能处理预测变量标准化。不需要自己写复杂的矩阵求逆和高斯推断代码理解核心原理后完全可以聚焦在特征工程和业务逻辑上。这也是我最终把项目主体放在MATLAB里的原因——写代码的速度快GUI组件可以直接用uifigure搭建模型训练完的图也能立刻可视化非常适合做一个完整的“数据-模型-界面”闭环演示。2. 核函数才是GPR的灵魂先弄懂再写代码2.1 核函数在做什么核函数决定的是两个样本点在函数空间里的“相似度”直接决定了GPR模型的平滑性和外推能力。用生活化的方式理解核函数就像是在告诉模型“如果两个时间点距离越近它们的温度就越像亲戚”。亲戚关系越紧密核函数值越大模型就越倾向于让这两个点的预测值彼此靠近。不同的核函数刻画不同的“亲戚规则”平方指数核假设平滑且处处可导适合缓慢变化的气候趋势Matern核允许一定的粗糙度能捕捉短周期波动周期核则专门表达“每隔固定天数温度形态重复出现”。拟合天气数据时如果只用平方指数核模型能抓住大趋势但节气转换时的急变容易过度平滑如果只用周期核又可能把特殊天气波动当成规律噪声。所以实际项目中比较实用的策略是组合多个基核。不过这里有个现实问题MATLAB内置的fitrgp直接支持的内核是平方指数、Matern族等常见选项想把周期核“混”进去需要写一点自定义核函数。在下文给的主程序里我用的是内置平方指数核周期信息主要通过特征工程里的sin/cos周期特征注入这样既能保证代码可跑又避免了自定义核函数带来的数值优化复杂性。2.2 把周期信息“喂”给GPR的小技巧天气预测里最明显的周期是年周期和季节周期。一个非常有效且工程上稳妥的做法是生成两个周期特征sin(2*pi*t/365)和cos(2*pi*t/365)。为什么要同时放sin和cos因为单放一个sin无法区分“一年中的具体相位”比如同一天在春秋两季温度不同sin值可能重复。sin和cos一起用相当于给模型提供了一个二维相位编码模型可以自由组合出任意相位的周期形态。类似地如果想捕捉90天的季节子周期可以再加sin(2*pi*t/90)和cos(2*pi*t/90)这一组。这一招非常实用因为它让普通的平方指数核也能感知周期性。气象数据里日期本身绝不能当普通数值丢给模型年份标签“2023年”和“2024年”的数值大小没有任何平滑意义模型会以为2024年比2023年“大了一码”预测自然混乱。正确的做法是把时间归一化后和周期特征一起组成特征向量。2.3 超参数需要理解到什么程度GPR的超参数主要有核函数的长度尺度、信号方差以及观测噪声方差。长度尺度决定模型认为“多远的样本算近亲”太小会导致预测曲线抖得像锯齿太大则把所有变化都当成噪声抹平。观测噪声方差对应的就是数据本身的测量误差或扰动。fitrgp在训练时会通过最大化边缘对数似然自动优化这些参数并不需要手动精细调整。但初值会影响优化结果我在代码里会给出一个经验初值并展示如何用MATLAB内置的自动超参数搜索进一步微调。对于刚入门的读者我的建议是一开始不要陷进超参数的数学推导里先把“核函数负责平滑程度、噪声方差负责容忍训练数据偏差”这个框架搭起来跑通实验后再回头研究参数细节。下面进入正题先把数据准备好。3. 数据准备的细节特征怎么构造直接影响预测上限3.1 训练样本的基本组织方式中短期天气预测可以建模成有监督回归问题给定过去一段时间的气象观测预测未来某个时刻的温度。训练集的一行样本是“当前已知特征”标签是“未来第h天的温度”。主程序里我用滞后特征用最近三天的温度、当天的湿度、气压加上时间周期特征预测当天温度。这种连续窗口滑动构造样本的方式非常直观代码里用向量移位就能实现。滞后温度的构造是这类预测里最容易出错的地方。直接写lag1 temp(2:end)和temp(1:end-1)配对是正确的但需要保证样本索引统一。我的做法是先把所有滞后序列生成好前几个填充nan然后从第4天开始取可用样本这样能确保每条训练样本的三个滞后温度都是真实观测值而不是空值。千万不要在特征矩阵里保留大量nan再送去训练fitrgp虽然能容忍一部分缺失但会导致预测质量不稳定。3.2 特征矩阵的完整字段我最终使用的特征字段如下表所示。每个字段的选择都有明确目的时间周期字段提供季节背景滞后温度字段提供短期惯性湿度气压字段提供当天的气象状态。特征字段说明维度归一化时间时间序号除以总天数避免数值过大1年周期sin/cos捕捉365天主周期2滞后1天温度最近一天的观测温度1滞后2天温度前两天观测温度1滞后3天温度前三天观测温度1当天湿度相对湿度观测值1当天气压海平面气压观测值1这个8维特征组合在几百到几千样本的规模下非常稳定。如果你想预测的不只是温度而是湿度或者气压只需把标签列换成对应的目标变量特征里保留其他变量即可。GPR对特征数量的容忍度比神经网络高8维输入完全在它的舒适区。3.3 数据划分与真实数据替换方案时间序列的数据划分必须按时间顺序不能随机打乱。随机打乱会人为破坏时间相关性造成未来信息泄露模型在测试集上会显得异常准确实际部署时立刻露馅。我在代码里把最后90天作为测试集其余作为训练集这是中短期预测里比较合理的比例。实际项目中你很可能不是用模拟数据。真实气象站提供的CSV格式通常是“日期、气温、湿度、气压”我建议你下载历史数据后保留前两列日期与气温把CSV放到与脚本相同的目录下替换主程序中的数据生成代码段即可。注意日期列需要解析成datetime类型因为绘制时间序列图时datetime轴比数值轴直观得多。4. 手把手实现MATLAB代码从数据到预测4.1 数据生成与特征工程脚本下面这段代码可以直接保存为GPR_Weather_Main.m运行。由于真实数据不是每个人都能方便地获取我内置了一个模拟数据生成器用年周期、季节周期、缓慢趋势和随机噪声叠加出730天的日温度序列同时生成湿度与气压。rng(42)保证了每次运行结果完全一致方便你对照复现。%% GPR_Weather_Main.m % 基于高斯过程回归的中短期天气预测示例 % 适用版本MATLAB R2021a 及以上 clear; clc; close all; % 1生成一个模拟监测站的日级气象数据 rng(42); nDays 730; % 两年日数据 t (1:nDays); trend 0.006 * t; % 缓慢的气候趋势 season 12 * sin(2*pi*t/365) 4*sin(2*pi*t/90); % 年周期季节波动 noise randn(nDays,1) * 1.2; temp 16 trend season noise; % 模拟温度序列 humid 60 16*sin(2*pi*t/3650.6) randn(nDays,1)*3; press 1013 8*sin(2*pi*t/1801.2) randn(nDays,1)*4; dates datetime(2021,1,1) caldays(0:nDays-1); % 2特征工程时间周期特征 滞后温度 湿度气压 timeFeat [ t/(nDays1), sin(2*pi*t/365), cos(2*pi*t/365) ]; lagTemp1 [nan; temp(1:end-1)]; lagTemp2 [nan; nan; temp(1:end-2)]; lagTemp3 [nan; nan; nan; temp(1:end-3)]; idx 4:nDays; % 前3天没有完整滞后项跳过 X [ timeFeat(idx,:), lagTemp1(idx), lagTemp2(idx), lagTemp3(idx), ... humid(idx), press(idx) ]; y temp(idx); % 3按时间顺序划分训练集/测试集 numTest 90; Xtr X(1:end-numTest,:); ytr y(1:end-numTest); Xte X(end-numTest1:end,:); yte y(end-numTest1:end); % 4训练高斯过程回归模型 gprMdl fitrgp(Xtr, ytr, ... KernelFunction,squaredexponential, ... KernelParameters,[log(1); log(1.5)], ... Sigma,0.2, Standardize,true); % 5测试集单步预测与置信区间 [pred, sd] predict(gprMdl, Xte); ci [pred-1.96*sd, pred1.96*sd]; % 6绘图 figure(Color,w); datesTe dates(idx(end-numTest1:end)); plot(datesTe, yte, b, LineWidth,1.5); hold on; plot(datesTe, pred, r--,LineWidth,1.2); fill([datesTe; flipud(datesTe)], ... [ci(:,1); flipud(ci(:,2))], [0.9 0.5 0.5], ... FaceAlpha,0.3, EdgeColor,none); legend(真实温度,GPR预测,95%置信区间,Location,best); xlabel(日期); ylabel(温度(°C)); title(GPR单步预测效果); grid on; % 7评估指标 rmse sqrt(mean((pred-yte).^2)); mae mean(abs(pred-yte)); coverage mean(yte ci(:,1) yte ci(:,2)); fprintf(RMSE%.3f MAE%.3f 区间覆盖率%.2f%%\n, ... rmse, mae, coverage*100);跑完这段代码你会看到真实温度、预测曲线和95%置信区间三条线叠在同一张图上。模拟数据下RMSE通常能控制在2.5度以内区间覆盖率在85%到93%之间这说明GPR的不确定性估计是相当可靠的。4.2 多步滚动预测从单步到未来7天实际使用中只预测一天显然不够用户要的是未来一周的趋势。多步预测有两种常见做法一种是递归法把上一步的预测值当作下一步的滞后特征继续输入另一种是直接法训练7个模型每个模型专门预测未来第h天。递归法简单但预测误差会逐步累积直接法每个模型独立但训练成本高、模型之间缺乏一致性。我在示例里选择递归法因为GPR自身给出的预测方差可以用来观察不确定性如何随预测步长增大而扩张这是非常有价值的可视化信息。% 在上一段代码基础上继续滚动预测未来7天 H 7; predSeries zeros(H,1); sdSeries zeros(H,1); lastTemp temp(end-2:end); % 最近三天的真实温度 curTime nDays; for h 1:H ft [ (curTimeh)/(nDays1), ... sin(2*pi*(curTimeh)/365), cos(2*pi*(curTimeh)/365), ... lastTemp(1), lastTemp(2), lastTemp(3), ... humid(end), press(end) ]; [p, s] predict(gprMdl, ft); predSeries(h) p; sdSeries(h) s; lastTemp [lastTemp(2:3); p]; % 用预测温度更新滞后窗口 end futureDates dates(end) caldays(1:H); figure(Color,w); plot(futureDates, predSeries, ro-,LineWidth,1.5); hold on; fill([futureDates; flipud(futureDates)], ... [predSeries-1.96*sdSeries; flipud(predSeries1.96*sdSeries)], ... [0.9 0.5 0.5], FaceAlpha,0.3, EdgeColor,none); xlabel(未来日期); ylabel(温度(°C)); title(未来7天滚动预测与95%置信区间); grid on;这段代码里有两个不能忽略的细节。第一滚动预测时湿度气压未来值未知我用最后一天的观测值补齐这是一个工程简化但如果项目对精度要求高建议对湿度气压也各训练一个GPR模型进行联合预测。第二更新lastTemp时用的是前一步的预测均值而不是采样一个随机值这会让预测方差略偏保守但对于演示目的完全可接受。4.3 置信区间读法与评估指标GPR预测输出的sd就是后验标准差。温度预测在正态假设下95%置信区间可以近似取均值±1.96倍标准差。这个区间非常重要如果未来天气处于剧烈变化阶段GPR会自然给出更宽的区间如果未来几天数据形态和训练集高度相似区间则相对较窄。这是传统点预测模型完全无法提供的特性。评估指标我在代码里输出三项RMSE和MAE衡量点预测精度区间覆盖率衡量真实值落在95%置信区间内的比例。理想情况下覆盖率应该接近95%如果覆盖率太低说明模型过度自信如果更高则说明区间过于保守。模拟数据下的覆盖率通常在90%上下因为递归预测的误差相关性会让区间偏窄这是正常现象。5. GUI设计从命令行到可视化工具5.1 组件布局与交互逻辑把训练脚本封装成GUI之后非编程人员也能独立操作。我采用uifigure编程式构建界面而不是GUIDE因为uifigure在现代MATLAB版本中显示效果更精致组件风格统一且支持原生数值输入框和表格。界面的左侧是控制台从上到下依次是加载/生成数据按钮、训练GPR按钮、预测天数输入框、开始预测按钮、指标表格。右侧三个坐标区分别展示测试集单步预测效果、未来多步滚动预测效果、整体训练数据形态。这样用户在训练前可以先看数据分布训练后直接对比单步与多步预测操作路径非常顺。5.2 完整GUI代码下面是完整的GUI程序。整个界面逻辑都封装在gpr_weather_gui函数中内部通过fig.UserData传递数据、模型和控件句柄避免使用全局变量污染工作区。训练模型的核心代码与主程序一致只是为了响应回调函数做了封装。function gpr_weather_gui() % GPR中短期天气预测系统 GUI % 使用方法在MATLAB命令行直接调用 gpr_weather_gui fig uifigure(Name,GPR 中短期天气预测系统 (MATLAB),Position,[100 100 1180 700]); % 左侧控制面板 left uipanel(fig,Title,控制台,FontSize,13,Position,[15 15 320 670]); btnLoad uibutton(left,Text,生成/加载模拟数据,Position,[15 600 290 40],... ButtonPushedFcn,(btn,event) loadData(fig)); btnTrain uibutton(left,Text,训练GPR模型,Position,[15 545 290 40],... ButtonPushedFcn,(btn,event) trainModel(fig)); uilabel(left,Text,预测未来几天,Position,[15 485 120 20]); nDayField uieditfield(left,numeric,Value,7,Limits,[1 14],... Position,[140 485 80 30]); btnPredict uibutton(left,Text,开始滚动预测,Position,[15 430 290 40],... ButtonPushedFcn,(btn,event) predictFuture(fig)); tbl uitable(left,Position,[15 80 290 240],ColumnName,{指标,数值},... ColumnFormat,{char,numeric},Data,{RMSE,0;MAE,0;覆盖概率,0;模型状态,未训练}); % 右侧结果区 right uipanel(fig,Title,结果区,FontSize,13,Position,[350 15 815 670]); ax1 uiaxes(right,Position,[30 320 370 320]); title(ax1,测试集单步预测); ax2 uiaxes(right,Position,[420 320 370 320]); title(ax2,未来滚动预测); ax3 uiaxes(right,Position,[30 30 760 260]); title(ax3,历史数据与预测趋势); % 初始化UserData fig.UserData struct(temp,[],humid,[],press,[],dates,[],... Xtr,[],ytr,[],Xte,[],yte,[],nDayField,nDayField,... gprMdl,[],ax1,ax1,ax2,ax2,ax3,ax3,tbl,tbl); end function loadData(fig) % 生成模拟数据与特征矩阵并绘制历史曲线 ud fig.UserData; rng(42); nDays 730; t (1:nDays); trend 0.006 * t; season 12 * sin(2*pi*t/365) 4*sin(2*pi*t/90); noise randn(nDays,1) * 1.2; temp 16 trend season noise; humid 60 16*sin(2*pi*t/3650.6) randn(nDays,1)*3; press 1013 8*sin(2*pi*t/1801.2) randn(nDays,1)*4; dates datetime(2021,1,1) caldays(0:nDays-1); [X,y,idx] genFeatureMatrix(temp,humid,press,nDays); numTest 90; ud.Xtr X(1:end-numTest,:); ud.ytr y(1:end-numTest); ud.Xte X(end-numTest1:end,:); ud.yte y(end-numTest1:end); ud.temp temp; ud.humid humid; ud.press press; ud.dates dates; cla(ud.ax3); hold(ud.ax3,on); plot(ud.ax3, dates, temp, b-,LineWidth,1); plot(ud.ax3, dates(idx(end-numTest1:end)), ud.yte, r-,LineWidth,1.2); legend(ud.ax3,{历史温度,测试集温度},Location,best); grid(ud.ax3,on); title(ud.ax3,历史观测曲线蓝色训练 红色测试); fig.UserData ud; end function trainModel(fig) % 使用训练集拟合GPR模型并在测试集上评估 ud fig.UserData; if isempty(ud.Xtr) uialert(fig,请先点击“生成/加载模拟数据”,提示); return; end gprMdl fitrgp(ud.Xtr, ud.ytr, ... KernelFunction,squaredexponential, ... KernelParameters,[log(1); log(1.5)], ... Sigma,0.2, Standardize,true); [pred, sd] predict(gprMdl, ud.Xte); ci [pred-1.96*sd, pred1.96*sd]; datesTe ud.dates(4 (numel(ud.ytr):numel(ud.ytr)numel(ud.yte)-1)); % 测试段日期 cla(ud.ax1); hold(ud.ax1,on); plot(ud.ax1, datesTe, ud.yte, b-,LineWidth,1.2); plot(ud.ax1, datesTe, pred, r--,LineWidth,1.2); fill(ud.ax1, [datesTe; flipud(datesTe)], [ci(:,1); flipud(ci(:,2))], ... [0.9 0.5 0.5], FaceAlpha,0.3, EdgeColor,none); legend(ud.ax1,{真实,预测,95%CI},Location,best); grid(ud.ax1,on); title(ud.ax1,测试集单步预测); rmse sqrt(mean((pred-ud.yte).^2)); mae mean(abs(pred-ud.yte)); coverage mean(ud.yte ci(:,1) ud.yte ci(:,2)); ud.tbl.Data {RMSE,rmse;MAE,mae;覆盖概率,coverage;模型状态,已训练}; ud.gprMdl gprMdl; fig.UserData ud; end function predictFuture(fig) % 基于最新观测与递归滚动法预测未来N天 ud fig.UserData; if isempty(ud.gprMdl) uialert(fig,请先训练GPR模型,提示); return; end H round(ud.nDayField.Value); lastTemp ud.temp(end-2:end); curTime numel(ud.temp); predSeries zeros(H,1); sdSeries zeros(H,1); for h 1:H ft [ (curTimeh)/(numel(ud.temp)1), ... sin(2*pi*(curTimeh)/365), cos(2*pi*(curTimeh)/365), ... lastTemp(1), lastTemp(2), lastTemp(3), ... ud.humid(end), ud.press(end) ]; [p,s] predict(ud.gprMdl, ft); predSeries(h) p; sdSeries(h) s; lastTemp [lastTemp(2:3); p]; end futureDates ud.dates(end) caldays(1:H); cla(ud.ax2); hold(ud.ax2,on); plot(ud.ax2, futureDates, predSeries, ro-,LineWidth,1.5); fill(ud.ax2, [futureDates; flipud(futureDates)], ... [predSeries-1.96*sdSeries; flipud(predSeries1.96*sdSeries)], ... [0.9 0.5 0.5], FaceAlpha,0.3, EdgeColor,none); legend(ud.ax2,{预测均值,95%置信区间},Location,best); grid(ud.ax2,on); title(ud.ax2,[未来 num2str(H) 天滚动预测]); end function [X,y,idx] genFeatureMatrix(temp,humid,press,nDays) % 构造GPR训练样本所需的特征矩阵与标签 t (1:nDays); timeFeat [ t/(nDays1), sin(2*pi*t/365), cos(2*pi*t/365) ]; lagTemp1 [nan; temp(1:end-1)]; lagTemp2 [nan; nan; temp(1:end-2)]; lagTemp3 [nan; nan; nan; temp(1:end-3)]; idx 4:nDays; X [timeFeat(idx,:), lagTemp1(idx), lagTemp2(idx), lagTemp3(idx), ... humid(idx), press(idx)]; y temp(idx); end这段GUI代码的组件全部通过绝对坐标定位结构清晰没有依赖复杂的App Designer文件。直接保存为gpr_weather_gui.m后调用即可。操作时注意顺序先点击“生成/加载模拟数据”再点击“训练GPR模型”最后在输入框填入7并点击“开始滚动预测”。5.3 回调函数如何串联模型GUI的核心是数据流按钮回调函数依次往fig.UserData里写入数据、模型、预测结果。训练回调完成后gprMdl保存在ud.gprMdl中预测回调开始时先检查ud.gprMdl是否为空为空就弹窗提示。这种“状态机”式的逻辑非常容易扩展——比如你想在界面里加一个下拉框选择不同的核函数只需要在训练回调中读取下拉框当前值然后把它传给fitrgp的KernelFunction参数即可。6. 实测、调参与踩坑记录6.1 数据泄露的隐蔽坑标准化顺序fitrgp的参数里有一个Standardize选项设为true时模型会自动对预测变量做标准化。这个设计很方便但如果你提前自己对整个数据集做了标准化再把训练集和测试集分别用同一套全局均值方差变换那么测试集的分布信息就已经泄露给训练过程了。更规范的做法是只用训练集的统计量对训练集做标准化然后用同一组统计量去变换测试集。如果你和我一样直接用fitrgp的Standardize开关就不要手动再对特征矩阵做标准化两者叠加会导致尺度信息重复处理影响核函数长度尺度的优化结果。我在实际项目里踩过这个坑表现是训练集预测得分很高测试集效果突然下降一截排查了半天才发现是手动标准化顺序写反了。6.2 数据量大之后的计算负担GPR的训练复杂度是样本数量的三次方级几百个样本毫无压力但一旦上万条日度数据fitrgp的训练时间会明显拉长。实际项目中如果数据量很大我的经验是优先降采样保留最近两三年的日数据对更早的样本做周平均或月平均后再加入训练。天气预测的中短期场景里久远数据对短期预测的边际贡献非常有限降采样损失的信息远小于训练时间带来的收益。如果必须用全量数据再考虑稀疏高斯过程近似方案但那是另一个话题了。另一个和计算相关的细节是fitrgp的默认拟合方法是精确法对内存要求高。训练前我会先确认内存充足同时把HyperparameterOptimizationOptions中的Verbose设为0避免优化过程刷屏拖慢速度。6.3 核矩阵病态与Sigma初始值如果训练数据中存在重复度极高的样本或者特征之间存在近似线性相关核矩阵可能接近奇异。fitrgp自身会对噪声方差Sigma设了下限但初始值给得太小会让优化过程不稳定。我习惯把Sigma初值设为0.1到0.3这个区间对应模拟温度噪声约1到2度的情况。如果你发现预测方差几乎为0、区间窄得异常优先检查Sigma是不是被优化到了极小值这时候手动设置一个合理初值往往能解决问题。6.4 这个项目还能怎么扩展这套代码的骨架可以很方便地迁移到其他时序场景。把标签换成逐时降水、空气质量指数、电力负荷等只需调整周期特征的天数参数和滞后窗口长度。如果你想做更长周期的预测还可以尝试多模型直接预测框架对h1到7分别训练一个GPR模型每个模型专门负责未来的第h天虽然训练时间约为递归法的7倍但能缓解误差累积而且每个模型的置信区间可以独立解读。最后再分享一个小技巧运行主程序之前先打开MATLAB的“在编辑器内运行”和“自动保存”选项再配合底部的grid on你会更快看清GPR在哪些天气突变点给出了更宽的区间——这些区间才是模型真正有价值的信息而不只是那条平平淡淡的预测曲线。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑