news 2026/10/3 10:37:16

葵花8 AHI 16波段+机器学习:地面太阳辐射反演全流程实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
葵花8 AHI 16波段+机器学习:地面太阳辐射反演全流程实践

简介:面向遥感与机器学习初学者的完整示例包,演示利用葵花8号AHI传感器多光谱数据反演地面太阳辐射,将卫星影像处理与监督学习流程串联,覆盖从数据读取、特征构建到模型预测的典型环节,适用于气候研究、环境监测及能源管理方向的算法验证与课题复现。包体共3个文件,约2.58MB,核心包括Python脚本、训练好的模型文件和示例CSV数据:脚本完成数据准备与推理调用,模型文件保存已训练权重,可直接加载预测,CSV样例数据便于快速跑通流程。目前已有251人学习。借助这套小规模工程包,读者可快速看到从AHI数据到辐射估算结果的最小闭环,既能理解遥感反演与机器学习结合的落地思路,也能在自备数据上替换输入、微调参数或扩展特征,进一步开展对比实验。

1. 把AHI的16个波段装进机器学习模型:地面太阳辐射反演这件老事的新做法

一座偏远的光伏电站想评估年发电量,最难拿到的不是天气数据,而是“这片山头一年到底晒到多少太阳”。地面辐射站太稀疏,一个省往往只有十几个点,而太阳辐射在空间上的变化又极其剧烈——一朵云过去,辐照度能掉一半。葵花8卫星的AHI传感器每10分钟扫一遍东亚—西太平洋区域,16个波段同时记录可见光反射率和红外亮温,云、气溶胶、水汽的痕迹都在里面。传统反演是拿这些观测值去跑辐射传输模型,等几分钟算一个像元,还要额外输入大气廓线和气溶胶光学厚度;用机器学习做地面太阳辐射反演,则是直接让模型学“AHI看到了什么,地面实际收到了多少”,训练好之后一张全圆盘的辐照度图几秒钟就能推完。这篇文章把这个zip背后的完整流程拆开讲:数据怎么拉、特征怎么造、模型怎么训、坑在哪里。适合做光伏资源评估、农业气象、遥感反演的工程人员照着复现。

2. 跳过辐射传输模型:为什么ML反演能又快又稳地输出地面辐照度

2.1 AHI的16个波段里,真正参与反演的主力和辅助

AHI(Advanced Himawari Imager)是葵花8的核心载荷,16个波段覆盖0.47μm到13.3μm。其中可见光和近红外有6个波段(B01–B06),空间分辨率0.5~1km;红外有10个波段(B07–B16),分辨率1~2km。10分钟一次全圆盘扫描,这个时间分辨率是极地轨道卫星给不了的——太阳辐射反演最怕的就是云的变化,10分钟已经能把大部分云团运动捕捉进来。

做反演特征时,16个波段不是等权重的。B03(0.64μm)是可见光主通道,云的反射率比地表高一截,越厚的云反射越强,对应到地面的辐射越低,这条负相关是整个模型的骨架。B04(0.86μm)对植被和水体的响应和B03不一样,可以用来区分“植被上的薄云”和“裸地上的厚云”。B05(1.6μm)和B06(2.3μm)则是最关键的辅助通道——雪在这两个波段的反射率会掉到很低,而云依然很亮。如果模型只喂了可见光通道,雪天就会把积雪当成云,把晴天反演成阴天,这个坑我在后面专门讲。

红外通道里,B13(10.4μm)到B15(12.4μm)这一组负责云顶温度和云厚度。B14和B15的亮温差是经典的分裂窗云检测判据,差值越大,说明云越薄或者有半透明卷云。B08(6.2μm)和B09(6.9μm)是水汽通道,它们对高层水汽敏感,在中纬度夏季的对流天气里很有用,但统计上容易和B13–B15产生共线性,加不加要看特征重要性的排序结果。

2.2 物理模型与ML模型的取舍:什么场景下换机器学习路线更划算

传统反演的路子是把AHI的表观反射率送进辐射传输模型,比如DISORT或者LibRadtran,反推地表短波辐照度。这个路线的优势是物理过程清楚,模型在训练数据覆盖不到的地区也有物理约束。但实操里有三个硬伤。

第一,辐射传输模型需要输入大气温度廓线、湿度廓线、臭氧总量、气溶胶光学厚度。这些参数本身往往来自再分析资料或者别的卫星反演产品,每一层都带误差,误差叠到最后,可能比你省掉的那部分物理过程还要大。第二,慢。全圆盘一个时次有上亿个有效像元,逐像元跑辐射传输,再快的机器也得算半天。常见的折中方案是提前算好查找表(LUT),但LUT的维度一多,存储和检索又成了问题。第三,云参数化是辐射传输里最不确定的一环,三维云场的辐射效应本身还是一个开放问题。

机器学习路线干脆绕开这些。AHI观测到的反射率和亮温,已经包含了大气和云的累积效应,地表辐照度是这些观测值的某种函数。模型要做的只是逼近这个函数。训练集覆盖到的天气类型里,ML反演的精度可以做到和物理模型相当甚至更好,典型晴天的RMSE在30~50 W/m²,云的误差会大一些。推理时延几乎为零,这是光伏功率预测这类业务最看重的一点。

选型建议很直接:如果目的是区域资源评估、光伏电站选址、短临功率预测,ML方案划算得多;如果要做气候尺度的物理一致性分析,可以用ML做快速预判,再挑关键日期用物理模型复核。至于“机器学习反演是不是黑匣子”,我的看法是——它确实是黑匣子,但你可以用残差分析打开它,这点放到最后一章说。

3. 拉数据,先对齐时间再对齐坐标:AHI L1与BSRN站点的匹配细节

3.1 下载AHI的常见渠道和NetCDF文件的基本组织方式

葵花8的L1级网格数据,常见做法是从JAXA的P-Tree系统拉取,注册账号后按时间范围选择区域和波段。文件命名类似HS_H08_YYYYMMDD_hhmm_B03_FLDK_R10_JP03.nc,中间那段是观测时刻(UTC),B03是波段号,FLDK代表全圆盘。全圆盘文件体积不小,按小时下载后要及时整理,别让磁盘吃紧。

NetCDF文件里每个波段是单独一个文件,所以要把多个波段拼到一个数据集里。数据的组织方式通常是y和x两个维度,配套的lat和lon是二维数组。这里有一个很关键的细节:L1可见光通道存的是反射率,通常按量化的整数存储,比如实际反射率乘以10000后存成int16;红外通道存的是亮温,单位开尔文,也要注意scale_factor。很多第一次做的人忘了除以scale_factor,特征量纲直接错掉,模型跑出来的结果跟噪声一样。打开文件之后先打印一下变量的属性,看清楚单位、scale_factor和valid_range再动手。

另一个节省时间的技巧是:做站点级别的反演时根本不用处理整个全圆盘。先根据站点坐标把文件裁成一个几度的窗口,后面所有计算都在这块小区域上进行。这个裁剪看起来简单,但对IO和时间都是数量级的优化。

3.2 地面站点实测辐照度:BSRN数据清洗和三类必须抓的坏值

葵花8反演的地面“真值”一般用BSRN(国际基准辐射网络)的站点数据,东亚地区可用的有日本Tateno等站点,提供1分钟或3分钟的GHI(全球水平辐照度)、DNI和DIF。BSRN的数据质量好,但也不是拿来就能用。

第一类要抓的是负值。夜间或者仪器零点漂移会导致很小的负辐照度,直接置零即可。第二类是物理极限值。当太阳天顶角小于85°时,GHI不可能超过太阳常数1361 W/m²乘以天顶角余弦,再乘一个日地距离修正系数,超出这个上界的数据直接删掉。第三类是时间戳对齐问题。卫星观测是一个瞬间时刻,而站点给出的是某一分钟的平均值,直接取站点在卫星过境时刻前后2分钟的均值最稳妥。另外,BSRN的时间戳是UTC,AHI的时间戳也是UTC,这一步不会有时区坑,但如果你混用了地方时,整个标签就全错了。

3.3 最近邻还是3×3均值:站点与卫星像元的匹配代码

匹配这一步是整个流程里最容易翻车的地方。AHI全圆盘的lat/lon是二维数组,不能简单用一维差值取最近索引。下面这段代码先用粗过滤裁出站点附近的窗口,再在窗口里找距离最近的像元,最后取3×3邻域均值作为特征。

import xarray as xr import numpy as np # 站点坐标(示例:日本Tateno,BSRN站点) site_lat, site_lon = 36.05, 140.13 # 读取葵花8 L1 NetCDF,单波段示例 ds = xr.open_dataset("HS_H08_20220101_0000_B03_FLDK_R10.nc") lat2d = ds["lat"].values lon2d = ds["lon"].values data = ds["reflectance"].values # 注意先检查 scale_factor # 1) 粗过滤:只保留站点周边 2 度窗口,避免对全圆盘算距离 mask = (np.abs(lat2d - site_lat) < 2.0) & (np.abs(lon2d - site_lon) < 2.0) ys, xs = np.where(mask) ymin, ymax = ys.min(), ys.max() xmin, xmax = xs.min(), xs.max() lat_crop = lat2d[ymin:ymax+1, xmin:xmax+1] lon_crop = lon2d[ymin:ymax+1, xmin:xmax+1] data_crop = data[ymin:ymax+1, xmin:xmax+1] # 2) 在窗口内找最近邻像元 dist = (lat_crop - site_lat)**2 + (lon_crop - site_lon)**2 iy, ix = np.unravel_index(np.argmin(dist), dist.shape) # 3) 取 3x3 邻域均值,抵消配准误差 iy0, ix0 = max(iy-1, 0), max(ix-1, 0) patch = data_crop[iy0:iy+2, ix0:ix+2] feature = float(np.mean(patch))

代码的逻辑分成三步:粗过滤减少距离计算的规模;最近邻定位到站点所在像元;3×3均值把邻域信息揉成一个值。为什么不用单像元?卫星和地面站之间有一个像元左右的视线配准误差,对可见光通道来说,单像元的反射率可能在云边界上跳变,3×3均值能平滑掉这种跳变。代价是损失一点空间细节,但对反演辐照度这种空间平滑量来说完全值。

这里要特别提一句:如果做的是区域辐照度图而不是站点单点,就不要做3×3裁剪了,保留完整的空间分辨率,把整块区域的特征张量直接喂给模型,最后输出的每一像元都是一条反演结果。

4. 特征工程与XGBoost基线:一条能跑出RMSE的反演流水线

4.1 先造太阳几何特征,再加通道组合特征

模型输入不能只有16个通道的观测值,太阳几何必须进去,因为地表辐照度首先服从太阳高度角的变化。最常用的三个特征是太阳天顶角的余弦、太阳方位角的正弦和余弦。方位角本身是循环量,直接用角度值会让模型误以为0°和359°差很远,拆成正弦余弦两个特征就没了这个问题。日地距离修正系数也可以作为特征加进去,虽然它的变化只有±3%,但在长时序训练里能减少季节性的伪相关。

通道特征里,B01到B06的反射率通道建议保持原始数值,不做归一化也能跑GBDT,但如果有量纲不一致的通道,先都缩放到0~1之间更好调参。红外通道的亮温单位是开尔文,数值在200~330之间,和反射率不在一个量级,GBDT对特征尺度不敏感,但如果你后面对照着做神经网络,就需要把特征都标准化。

衍生特征里我一般固定加三组。第一组是B03除以B06,雪和云的判据主要靠它,雪在1.6μm反射率骤降,比值会异常偏大;第二组是B13减B15,厚云和薄云的分野;第三组是B03和B13的差值,用来粗略区分低云和高云,低云顶部温度高,和高云的亮温差在数值上差别明显。这三组特征对云的刻画能力比单纯加通道强很多,而且在特征重要性排序里常年排在前列。

时间特征要不要加?小心一点。直接把小时和儒略日扔给模型,模型可能会记住“某个站点某个钟头的历史平均”,而不是学习辐射物理。如果一定要加,把儒略日拆成正弦余弦两个连续特征,这样至少不会在跨年边界产生突变。

4.2 训练集绝不能随机打乱:按连续时间块划分

划分训练集和验证集是反演任务里最容易被忽略的步骤。随手train_test_split(random_state=42)一下,十有八九会得到令人惊喜的验证RMSE,但一上真实预报全露馅。原因很简单:相邻10分钟的样本高度相关,随机打乱会导致验证集里混着大量训练集样本的“隔壁时刻”,模型等于偷看了答案。

正确做法是按连续时间块划分。比如2019到2021年每个月抽7天生成训练样本,2022年全年做验证。这样验证集里的每一条样本在时间上和训练集至少隔开了一段距离,考验的是模型真正的泛化能力。样本量如果太大,还可以按日期分桶做K折,但千万不要按样本行做K折。

4.3 最小训练脚本:从特征表到RMSE的完整代码

下面这个脚本可以直接跑。特征表是我用前面几步生成的DataFrame,一行代表一个站点一个时刻,列是特征,ghi列是站点实测辐照度。

import pandas as pd import numpy as np import lightgbm as lgb from sklearn.metrics import mean_absolute_error, mean_squared_error # 读取第3节生成的训练样本表 df = pd.read_parquet("ahi_ghi_dataset.parquet") # 按时间不重叠划分:训练集2019-2021,验证集2022 train = df[df["time"] < "2022-01-01"] valid = df[(df["time"] >= "2022-01-01") & (df["time"] < "2023-01-01")] feature_cols = [ "sza_cos", "saa_sin", "saa_cos", "earth_sun_distance", "B01", "B02", "B03", "B04", "B05", "B06", "B07", "B08", "B09", "B10", "B11", "B12", "B13", "B14", "B15", "B16", "B03_B06_ratio", "B13_minus_B15", "B03_minus_B13" ] X_train, y_train = train[feature_cols], train["ghi"] X_valid, y_valid = valid[feature_cols], valid["ghi"] model = lgb.LGBMRegressor( n_estimators=800, learning_rate=0.05, num_leaves=63, subsample=0.8, colsample_bytree=0.8, random_state=42 ) model.fit(X_train, y_train) pred = model.predict(X_valid) rmse = np.sqrt(mean_squared_error(y_valid, pred)) mae = mean_absolute_error(y_valid, pred) mbe = np.mean(pred - y_valid) print(f"RMSE={rmse:.2f} W/m², MAE={mae:.2f} W/m², MBE={mbe:.2f} W/m²")

LightGBM的参数需要解释一下。num_leaves=63控制单棵树的复杂度,对十万级样本的反演任务来说,63到127之间是一个合理区间,再大就容易记住站点周边的局部噪声。subsample=0.8和colsample_bytree=0.8分别是行采样和列采样,加了之后能明显降低过拟合。learning_rate=0.05配n_estimators=800,树的棵数已经不少,如果验证集RMSE继续下降,可以再把学习率降到0.03并适当增加迭代轮数。

指标不要只看RMSE。MBE(平均偏差)反映系统性的高估或低估,如果模型在晴天整体偏高,MBE会直接暴露出来。一般反演业务要求MBE绝对值在10 W/m²以内,否则光伏站点预测的月度发电量会明显漂移。

这里只给了GBDT基线。GBDT的好处是对特征尺度不敏感、训练快、特征重要性可以直接用,适合先把流程跑通。跑通之后再考虑上卷积网络,把3×3邻域或者更大窗口的空间信息直接作为模型输入,精度还能往上走一截,但排错的难度也会翻倍。

5. 葵花8反演避坑指南:让模型翻车的五个细节

5.1 验证集RMSE虚低,上线预报就翻车

现象:训练集和验证集都用随机划分,验证RMSE漂亮得惊人,30 W/m²左右;换到一整年连续数据做预测,误差直接翻倍。

原因:相邻时刻的卫星观测和地面辐照度强相关,随机划分造成信息泄漏,验证集里全是训练样本的“邻居”,模型等于开卷考试。

解决:改成按连续时间块划分,训练集和验证集在时间上完全断开。如果数据跨越多年,还可以做按月的分组验证,看看模型在不同季节上的稳定性。

5.2 晴空误差很小,一到多云天就崩

现象:分场景统计误差时,晴天的RMSE只有30多,多云天却到90以上,整体指标被云拖着走。

原因:云天样本占比低,模型把主要容量都用来拟合晴空规律了。更麻烦的是云的形态太多,层云、积云、卷云的辐射特征完全不一样,样本不均衡时模型学不全。

解决:训练时按云量分层采样。可以用AHI自带的云检测产品(CLM)给样本打标,没有的话用B03反射率粗判,训练集里保证云和非云的比例接近1比1。还有一种做法是对云天样本复制或加权,但加权更稳妥,复制容易过拟合。

5.3 日出日落时段预测系统性偏低

现象:太阳天顶角大于70°时,模型预测值整体偏低,早上和傍晚尤其明显。

原因:低太阳高度角下,阳光穿过的大气路径更长,可见光反射率对云的响应变钝,同样的云量在傍晚看起来和早晨不一样。另一个原因是训练样本里低角度样本占比少,模型没学够。

解决:最简单的办法是在训练时剔除天顶角大于80°的样本,反正光伏出力在这个时段也可忽略。如果业务需要全时段输出,把天顶角余弦作为一个特征,同时按天顶角分层采样,保证低角度样本不缺失。

5.4 雪天把雪当云,晴天被反演成阴天

现象:冬春季节的晴天反演结果偏低,误差分布的峰值恰好对应降雪后的地表。

原因:雪的可见光反射率和云很像,模型在可见光通道上分不清二者,于是把积雪当成云,推算出“少得”的地面辐射。

解决:把B05(1.6μm)和B06(2.3μm)通道加进特征,或者直接用B03和B06的比值做衍生特征。雪在短波红外的反射率远低于云,这个比值能把雪和云切开。如果覆盖范围包括高纬度地区,这个特征几乎是必加的。

5.5 站点反演准,离站50公里就漂

现象:模型在BSRN站点位置的验证误差可以接受,但把整张区域辐照度图画出来,离站点越远越不对劲。

原因:站点训练样本只代表了站点的局地环境。山区尤其明显,一个山谷里的站点和对面山脊的辐照度差异很大,但卫星像元分辨率是1~2公里,模型学不到这种微地形信息。

解决:在训练集里加入更多空间分散的站点;如果只有单站数据,就不要指望模型输出高精度的区域图,把输出结果折算成晴空指数的距平会更稳妥。另一种思路是用DEM高程做地形校正特征,至少能修正一部分海拔带来的系统性偏差。

6. 残差里藏着物理:用时空切片验证模型学会了什么

模型训练完,先别急着上业务。用验证集把预测值和实测值做差,得到逐时次的残差,然后按三个维度去切:太阳天顶角、季节、云量。这一步能告诉你模型到底学的是物理规律还是数据记忆。

按太阳天顶角切残差,把天顶角从10°到80°分成几个区间,每个区间算平均残差。如果模型在低角度区间出现系统性负偏,说明余弦特征没有起到应有的作用,回到特征工程里查太阳几何的计算是否有误。按季节切残差,重点看梅雨季节和冬季,这两个季节云的类型差异大,模型如果在梅雨季整体偏高,通常是水汽通道的特征权重不够。按云量切残差时,可以用模型输出的晴空辐照度做归一化,画一条“残差随云量变化”的曲线,曲线如果在云量中等区间出现明显的尖峰,说明样本不平衡的问题还没根治。

还有一个值得做的互较实验:挑几个典型日,把模型输出的逐时辐照度日变化曲线和实测曲线画在一起,再叠一条由辐射传输模型算出的晴空曲线。晴空日如果模型曲线和物理模型曲线、实测曲线三者贴合,说明模型的晴空物理是正确的;云天日如果模型和实测贴合但和物理模型偏离,说明ML至少在统计意义上抓住了云的效应。

这几年做反演,我最后悔的事不是调参不到位,而是最开始没花足够时间做数据对齐。特征和模型随时可以重来,但时间戳错位、坐标偏移、尺度因子没还原这些错误,会让后面所有工作都建在流沙上。在这个zip里,真正值钱的不是某个模型结构,而是一条从原始遥感文件到干净训练样本的流水线。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 10:36:23

金融科技教职怎么申?从港科大(广州)学域招聘看Tenure-track规则

每年这个季节&#xff0c;学术圈的朋友们都会在几个固定群聊里互相转“招人”信息。金融科技的教职招聘算是这几年热度最高的方向之一&#xff0c;刷到港科大&#xff08;广州&#xff09;金融科技学域招Tenure-track教职这条&#xff0c;我盯着看了好久——不只是因为学校名头…

作者头像 李华
网站建设 2026/10/3 10:36:21

马德拉酒凭什么“不死”?加强型葡萄酒的工艺、陈年与品鉴指南

如果你常在进口葡萄酒货架前晃悠&#xff0c;大概率见过一类瓶子&#xff1a;深色玻璃、酒标上画着老式帆船&#xff0c;写着“Madeira”几个字母。这名字对多数人是陌生的&#xff0c;有人把它当成普通甜酒&#xff0c;有人以为和某种蛋糕有关&#xff0c;甚至有人直接跳过——…

作者头像 李华
网站建设 2026/10/3 10:35:32

东华OJ 69-73题保姆级解析:C语言基础编程避坑指南

东华OJ基础题69到73这一连续区间&#xff0c;在学弟学妹群里被问到的频率一直不低。理由很简单&#xff1a;这五道题几乎是东华大一C语言课“从语法到算法”的分水岭&#xff0c;前面的题目主要考你“知不知道这个语法”&#xff0c;到这里开始考你“能不能把语法组合起来解决问…

作者头像 李华
网站建设 2026/10/3 10:33:06

2026最新Java面试八股文:从集合到并发,拆解大厂高频考点

1. 为什么2026年大厂还在问八股文&#xff1a;面试官真正想验证的不是记忆力每年春招秋招&#xff0c;我都会在后台收到一大波类似的问题&#xff1a;八股文背了就忘怎么办&#xff1f;面试官为什么总爱问那些网上搜得到答案的东西&#xff1f;说实话&#xff0c;在2026年这个节…

作者头像 李华
网站建设 2026/10/3 10:32:58

多模型调用实战:GPT-6与Opus 5.5统一网关架构与避坑指南

1. 多模型调用这件事&#xff0c;为什么突然成了刚需最近圈子里讨论最多的两件事&#xff0c;一个是 GPT-6 的价格直接腰斩&#xff0c;另一个是 Opus 5.5 正式上线。这两个消息放在一起看&#xff0c;其实指向同一个趋势&#xff1a;大模型的能力在快速拉平&#xff0c;而调用…

作者头像 李华
网站建设 2026/10/3 10:32:55

Ubuntu+ROS2+Isaac Sim机器人仿真环境搭建:避坑指南与桥接实战

做机器人仿真开发&#xff0c;Ubuntu、ROS2、Isaac Sim这套组合这几年几乎成了标配。但环境搭建从来不是“照着文档敲三条命令”那么简单&#xff0c;版本匹配、显卡驱动、DDS通信、桥接配置&#xff0c;每一个环节都能卡住一批人。我见过太多人卡在装到一半系统黑屏、ROS2装完…

作者头像 李华