ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

地理加权回归(GWR)在空气质量指数预测中的应用与Python实现

地理加权回归(GWR)在空气质量指数预测中的应用与Python实现 简介面向GIS、空间统计方向的学生与科研人员这是一份完整的课程论文核心主题为应用地理加权回归GWR与克里金插值法预测空气质量指数附录直接提供Python源代码。文档系统介绍GWR作为普通线性回归的扩展如何将地理位置嵌入回归参数涵盖核函数选择、基于CV或AICc的带宽优化、回归系数显著性分析并与OLS模型对比以凸显空间非平稳性捕捉能力克里金部分则讲述利用变异函数进行空间插值、填补监测空白、生成连续污染分布图的流程案例中涉及数据预处理、模型拟合、预测评估如RMSE、R²与结果解释。附录给出地理加权回归预测、克里格插值、地图可视化三份可运行的Python程序对应从建模、插值到成图的完整链路便于读者对照论文复现实验。资源压缩包内仅有1个docx文件大小1.08MB论文按引言、研究方法、GWR案例分析、克里金案例、总结与讨论章节组织。目前已有1256人浏览学习适合希望由完整案例逐步掌握空间建模与插值分析实战技能的学习者。1. 空气质量指数预测里GWR 为什么比 OLS 高出 0.5 个 R2同一批站点数据普通线性回归OLS的拟合优度只有 0.417换成地理加权回归GWR直接拉到 0.916。这不是调参调出来的巧合而是空间数据本身的异质性在起作用——北京北部的怀柔、密云和南部的朝阳、丰台气温、气压、风速对空气质量指数AQI的响应强度完全不同全局模型把这种差异强行压成了一个平均系数自然拟合不好。这份课程论文资源正好把这件事讲透了它用 GWR 模型和克里金法对空气质量指数做了完整预测从模型原理、核函数选择、带宽优化到预测误差对比都有附录还带了地理加权回归、克里格插值、地图可视化三份 Python 代码。如果你是做空间统计课程设计、毕业论文或者手头有气象站点数据想试试局部回归这份资源可以直接当模板抄。2. GWR 模型原理与校准从权重矩阵到带宽搜索2.1 为什么 OLS 在空间数据上会失效普通线性回归的假设是全局参数估计也就是所有观测点共享同一组回归系数。但空气污染这件事天然是局部的城市发展密度、地形地貌、气象条件都随位置变化一个研究区域内很难找到一组系数能同时解释北部山区和南部城区的 AQI 变化。GWR 的核心改动是把地理位置 (ui, vi) 嵌入到回归参数里每个观测点都有自己的局部系数模型变成 yi β0(ui,vi) Σ βk(ui,vi) xik εi。这样估计出来的系数是空间坐标的函数能直接反映变量关系在空间上的非平稳性。权重矩阵是 GWR 区别于 OLS 的关键。对于回归点 i周围每个观测点 j 对它的影响不是等权的而是按距离衰减。常见做法是定义空间核函数论文里用的是 bi-square 核距离大于带宽 bs 的点权重直接归零带宽范围内的点按 (1 - (dij/bs)²)² 衰减。另一个选项是高斯核所有点都有权重但随距离指数衰减。选 bi-square 的好处是计算快、有明确的局部邻域范围适合站点分布比较均匀的数据高斯核更平滑但每个回归点都要遍历全部样本点数据量大时开销高。2.2 自适应带宽为什么固定带宽不靠谱带宽 bs 直接决定了局部邻域的大小这是 GWR 里最敏感的超参数。如果研究区域站点分布不均固定带宽会出问题城区站点密集固定带宽圈进来太多点局部特征被抹平郊区站点稀疏固定带宽范围内可能只有两三个点回归结果波动极大。所以论文明确说明除非对研究区域非常了解否则不要用固定带宽而是采用自适应带宽——带宽随着局部站点密度自动调整保证每个回归点周围大致有相同数量的邻居参与估计。自适应带宽的搜索目标是让模型拟合指标最小化。论文给了两个指标CV交叉验证和 AICc修正的赤池信息准则。CV 计算时对每个校准点 i用除 i 以外的点去预测 i 的属性值累积误差最小的带宽就是最优带宽。AICc 则更注重模型的复杂度惩罚公式里包含了帽子矩阵的迹 tr(S)也就是有效参数个数 ENP用来防止带宽过小导致模型过度拟合。实际使用中AICc 比纯 CV 多了一层复杂度约束搜索结果通常更稳定。2.3 模型校准的完整流程与代码骨架论文里校准过程的顺序可以归纳为数据预处理 → 指定核函数 → 用 CV 或 AICc 搜索最优带宽 → 构造权重矩阵 → 求解局部系数 → 输出结果做显著性检验和预测。这里给出一个基于 mgwr 库的常见实现骨架mgwr 是 Python 生态里比较成熟的 GWR 实现内置了带宽搜索和系数估计import numpy as np from mgwr.gwr import GWR from mgwr.sel_bw import Sel_BW # coords: (n, 2) 数组每行是 (x, y)注意要和 X, y 的行严格对齐 # y: AQI 观测值列X: 自变量矩阵不含截距列库会自动加 selector Sel_BW(coords, y, X, kernelbisquare) bw selector.search(criterionAICc) # 自适应带宽搜索返回最优带宽 model GWR(coords, y, X, bwbw, kernelbisquare) results model.fit() print(results.params) # 每个观测点的局部回归系数 print(results.tvalues) # 每个系数的局部 t 值用于显著性检验这段代码里Sel_BW 的 search 方法会在带宽范围内用黄金分割搜索找 AICc 最小的值kernel 参数要和论文一致用 bisquare。搜索过程比较耗时站点数几百个时通常要跑几分钟到十几分钟。如果数据量很大可以先检查 coords 的单位是否统一成米或千米避免坐标跨度过大导致带宽搜索的代数范围失控。2.4 求解细节从权重矩阵到系数估计最优带宽确定后权重矩阵 W 就固定了。对每个回归点 iGWR 的局部系数通过加权最小二乘求解βi (XT Wi X)⁻¹ XT Wi y其中 Wi 是对角阵对角元素就是核函数计算的各观测点对 i 的空间权重。注意这不是一次性算完的而是对每个点 i 单独构造 Wi、单独做一次矩阵运算所以结果是一个 n×k 的系数矩阵每一行对应一个站点的局部系数。求解后还要算两个诊断量帽子矩阵 S 的迹 tr(S) 是有效参数个数 ENP它衡量模型的复杂度局部系数的方差是 diag(Ci CiT)σ² Ci (XT Wi X)⁻¹ XT Wi开根号后和系数相除就得到局部 t 值。t 值用于判断某个自变量在特定区域的系数是否显著这在后面分析北京案例时是核心工具。整个流程里最容易出错的是变量预处理比如量纲不统一会导致系数大小无法横向比较建议先做标准化再进模型。3. 北京 AQI 案例复盘R2 提升、系数分布与 t 检验解读3.1 OLS 与 GWR 的对比怎么读论文用北京地区站点数据做了实际案例因变量是 AQI自变量选了气温temp、气压hpa、湿度wet、风速speed、风向距离dir、高度height六项原本还有 mm 变量但因为全部为 0 被剔除。表 1 是变量说明这里不重复列直接看模型对比的核心结果模型R2AICcOLS0.4173067.762GWR0.9162567.705R2 从 0.417 涨到 0.916 只是表象更有说服力的是 AICc 从 3067.762 降到 2567.705降幅达到 500 左右。AICc 没有量纲它只能在同一样本、同一因变量的模型之间比较数值越小说明在拟合度和复杂度之间权衡得越好。500 的差距在模型选择里是压倒性的说明 GWR 多出来的那些局部参数没有白给它们确实捕捉到了 OLS 看不出来的空间结构。3.2 回归系数统计表标准差才是重点论文里的表 3 是 GWR 参数估计的统计汇总我把它整理成表变量均值标准差最小值中位数最大值X0截距242.891175.235-47.173219.557684.194X1temp-56.43861.919-224.324-32.7726.342X2hpa-134.426122.518-417.690-112.837137.722X3wet-54.14972.738-343.496-31.62661.710X4speed2.12914.715-13.292-1.72241.355X5dir-16.39113.861-43.036-19.2215.386X6height-134.255618.439-1723.287-176.9641012.123这张表最有价值的是标准差列。看 X6height的标准差高达 618.439最小值和最大值差了接近 2700这说明高度对 AQI 的影响方向在空间上完全不一致——某些区域高度增加会显著降低 AQI另一些区域则相反。如果只报告一个全局系数这种空间非平稳性就被彻底掩盖了。X4speed的均值只有 2.129但标准差 14.715同样说明风速的影响在不同站点有正有负。用 GWR 做分析时系数统计表的均值不能当作“平均效应”来解释必须结合标准差和显著性图看。3.3 显著性检验哪些区域的系数是可信的论文对每个回归系数做了 t 检验并在 α0.05 显著性水平下绘制了不同区域的显著程度。结论非常有空间特征temp 对朝阳区、昌平区、顺义区的 AQI 影响极为显著对北京大部分区域都是显著负影响而且从南部到北部影响强度由小变大hpa 对密云、昌平、房山、大兴、石景山的显著性极强影响系数大多在 0 到 200 之间通州是唯一存在显著正面影响的点位wet 的正面影响集中在石景山、丰台、房山密云北部的影响系数达 -343是负面影响最大的区域speed 对北京的东北部有显著正面影响对石景山、延庆、朝阳、大兴则显著为负。这些区域化的结论才是 GWR 真正的产出。做汇报或者写论文时不要只贴一张系数均值表要配合地图把每个变量的显著性画出来。你会发现同样的气象变量在密云和平谷的作用机制可能完全不同这种信息是 OLS 永远给不了的。论文里的 t 值检验逻辑用的是局部 t 统计量代码里直接取 results.tvalues 就能拿到配合地图可视化可以快速定位显著区域。4. 预测阶段的两种路线GWR 输出与克里金插值的误差对比4.1 用 GWR 做下一期预测论文的 GWR 预测部分用了第 23 期数据模型先在前面的时间点上完成校准再把新一期的自变量和坐标代入训练好的 GWR 关系里得到 16 个站点的 AQI 预测值。预测值的均方误差是 449.4411776注意这个量级直接看不容易有感觉开根号后是 RMSE ≈ 21.2也就是平均每个站点的预测值和真实值偏差在 21 个 AQI 指数点左右。在空气质量指数这种受气象随机扰动影响明显的场景里这个误差水平可以接受但不算优秀。MSE 的计算口径很简单import numpy as np # 论文表4的GWR预测值16个站点 pred np.array([ 119.16, 28.02, 83.50, 34.80, 31.89, 78.20, 30.42, 78.29, 40.82, 23.69, 52.10, 43.42, 46.97, 56.27, 63.70, 44.16 ]) # 真实值来自第23期观测按站点顺序排列 y_true np.array([...]) # 这里填你自己数据集上的真实值 mse np.mean((pred - y_true) ** 2) rmse np.sqrt(mse) print(MSE:, mse, RMSE:, rmse)这里要提醒一点预测之前必须确认建模用的自变量在第 23 期也是可得的。论文的路线是先用已知站点数据训练再用新一期自变量输入模型它预测的是“给定气象条件AQI 大概是多少”不是纯时间序列外推。如果你的数据里气象变量也是预测出来的误差会叠加实际效果要看整体链路。4.2 克里金插值的实现与拟合质量判断克里金法走的是另一条路线它不做回归而是利用空间自相关做插值。论文用的是泛克里金选取 temp、hpa、wet、speed、dir、mm、height 七个自变量其中 mm 全为 0 被剔除取 time22 的样本进行拟合半变异函数选用高斯模型。拟合参数如下模型块金常数基台值变程高斯模型3.88034880e012.95014344e-027.59106034e00拟合效果的判断参数有三个Q1 越接近 0 越好Q2 越接近 1 越好cR 越小越好。论文的结果是 Q10.63、Q21.126、cR6.68论文自己标注“拟合的效果一般”。这个判断很诚实Q2 超过 1 说明模型对变异函数的拟合存在偏差cR 偏大则提示残差还有空间结构没被完全吸收。克里金模型的诊断就是看这三个参数不要因为插值能出图就觉得结果是可靠的参数不过关说明半变异函数选型或者数据平稳性处理还有问题。4.3 两种方法的预测误差对比与选型建议克里金在第 23 期坐标点上做预测均方误差是 423.2909487RMSE ≈ 20.6和 GWR 的 21.2 非常接近。这个结果说明在当前的站点密度和变量条件下两种方法的能力上限差不多选哪个取决于你的目标GWR 适合回答“什么因素在什么区域影响 AQI”——它产出的是可解释的回归系数能结合 t 检验说明气象因子和 AQI 关系的空间分布克里金适合回答“没有监测站的地方 AQI 大概是多少”——它产出的是空间插值面不需要解释变量也能工作但你要先拟合好半变异函数。实操中常见做法是两条路线都跑一遍用交叉验证比较误差之后再做决定。论文里两套流程的误差相差不到 1 个 AQI 指数点谁都没有压倒性优势这时候判断标准就落到业务需求上要解释还是要填图。5. 复现避坑从全零变量到克里金拟合参数怎么判读5.1 数据预处理阶段全零变量与坐标对齐坑 1全零变量不剔除模型直接翻车。现象是 mm 变量所有观测值都是 0如果不处理直接放进设计矩阵GWR 的局部拟合 (XT Wi X)⁻¹ 会出现矩阵奇异或数值极不稳定的情况因为 XTX 退化导致求逆失败轻则系数巨大重则直接报 LinAlgError。原因是全零列对回归没有任何信息贡献但它会让矩阵不满秩。解决方法是进模型前先做一次变量筛查import pandas as pd df pd.read_csv(aqi_station.csv) zero_cols df.columns[(df 0).all()].tolist() print(全零列, zero_cols) # 本例输出 [mm] df df.drop(columnszero_cols)坑 2坐标和属性行没对齐。现象是跑出来的系数空间分布看起来是一团乱麻检验后发现某几个站点数值夸张。原因是筛选缺失值后数据行变了但坐标矩阵 coords 还是原顺序行索引对不上相当于把朝阳站点的坐标配到了密云站点的属性上。解决方法是把站点 ID、坐标、自变量放在同一个 DataFrame 里统一清洗进入 mgwr 之前用同一套索引切片。5.2 模型拟合阶段带宽、系数与误差的口径坑 3自适应带宽搜索特别慢还容易搜到边界值。现象是 Sel_BW 跑了几十分钟还没结束或者返回的最优带宽恰好落在搜索范围的边界上。原因是坐标尺度不统一比如 X 用经纬度、Y 用米导致距离计算失真搜索范围上下界设置不合理。解决方法是先把经纬度投影成平面坐标比如 UTM检查坐标单位的数量级再设置搜索范围站点数超过 500 时可以先用一部分样本粗搜出一个带宽区间再在区间内精搜能省一半时间。坑 4系数标准差巨大不等于模型坏了。现象是表 3 里的 X6 标准差 618看起来像是数值问题新手容易直接下结论说 GWR 不稳定。原因恰恰是空间非平稳性的体现——高度对 AQI 的效应在山区和平原是反向的全局统计自然会把差异摊到方差里。解决方法是画系数分布图按 t 值的显著性做掩膜只解释显著区域内的系数不要拿全局均值覆盖局部结论。GWR 的系数本来就是分区域的越大说明这个变量的空间异质性越强。坑 5MSE 和 RMSE 混用误差量级判断错位。现象是论文报告 MSE 449.44有人直接说“预测误差 449”感觉很差。原因是把平方误差当成了原始量纲的误差。解决方法是先平方根得到 RMSE≈21.2再结合 AQI 的量级去评价。448 这个数字在 MSE 口径里其实是可接受水平但只有换算成 RMSE 才能和别的模型比。建议每次跑完预测都同时输出 MSE 和 RMSE汇报时用 RMSE诊断时看 MSE 的分解。坑 6克里金拟合参数 Q2 超过 1.126不要硬吹模型好。现象是插值图很好看但表 6 里的 Q21.126 已经超过理想值的 1cR6.68 偏大。原因是高斯模型对半变异函数的拟合支持不足可能是数据存在趋势项没去掉泛克里金应该先用多项式把漂移成分拟合掉再对残差做普通克里金。解决方法是换指数模型或球状模型对比 Q1/Q2/cR或者先对 AQI 做去趋势处理再拟合。记住一个原则克里金的效果看的是变异函数拟合质量不看出图好不好看。6. 把附录代码改造成自己的工具三份脚本的落地用法这套资源附带了三份代码GWR 预测程序、克里格插值预测程序、地图可视化程序。拿到手之后不要直接整个跑先把三份代码拆开按模块改造成可复用的函数再用自己的数据去替换。GWR 脚本的核心是用 mgwr 完成带宽搜索和模型拟合我在第 2 章给的骨架基本就是它的精简版。你要改的是数据读取部分把 CSV 路径、列名映射、因变量和自变量列表抽成函数参数。克里金脚本如果是基于 pykrige 的核心是 OrdinaryKriging 或 UniversalKriging 的调用需要改的是变异函数模型选择高斯、指数、球状和参数。地图可视化脚本通常是用 matplotlib 加 geopandas 画站点散点和系数分布这里给一个常见的地图可视化骨架import geopandas as gpd import matplotlib.pyplot as plt # gdf: GeoDataFrame包含站点坐标、AQI预测值、GWR局部系数 fig, ax plt.subplots(1, 2, figsize(14, 5)) ax[0].set_title(GWR 预测 AQI 空间分布) gpd.GeoDataFrame(gdf, geometrygpd.points_from_xy(gdf.lon, gdf.lat)) \ .plot(columnpred_aqi, axax[0], cmapRdYlBu_r, legendTrue, markersize40, edgecolorblack) ax[1].set_title(temp 局部系数分布) plot_df gdf.dropna(subset[coef_temp]) gpd.GeoDataFrame(plot_df, geometrygpd.points_from_xy(plot_df.lon, plot_df.lat)) \ .plot(columncoef_temp, axax[1], cmapcoolwarm, legendTrue, markersize40, edgecolorblack) plt.tight_layout() plt.savefig(gwr_result_map.png, dpi200)注意可视化层面除了把 GWR 局部系数画出来还要把蒸汽的预测值残差画出来——用 matplotlib 自带的色带就能出图关键在于把显著性和不显著性的点用不同形状区分开这样看图的人才能一眼看出哪些区域系数可信。完整复现一遍后你会发现这套流程最有价值的部分不是某个模型有多准而是它把「空间异质性诊断」的方法走通了先用 OLS 建立基准再用 GWR 验证局部差异最后用克里金补齐无站点区域三个工具恰好覆盖了解释、校验、插值三个环节。从那以后我每次拿到空间数据集都会强制先跑一遍变量筛查、坐标对齐、带宽搜索三步流程再把 GWR 和克里金的误差对比列出来——这套习惯至少帮我避开了五六个翻车场景。希望帮到你。本文还有配套的精品资源点击获取
返回列表