拓冰建站拓冰建站
首页 / 资讯中心 / 正文

GWR与克里金联合建模提升空气质量空间预测精度

简介本资源是一份面向地理信息科学、环境科学及空间统计方向学习者与研究者的课程论文实践资料聚焦于利用地理加权回归GWR模型与克里金插值法对空气质量指数进行空间建模与预测。资源完整呈现了方法原理、建模流程、结果分析与代码实现全过程特别适合具备Python基础和GIS初步认知的本科生或入门级科研人员开展空间回归与插值实操训练。压缩包为1个1.08MB的docx文件内含规范论文正文含引言、GWR与克里金方法详解、案例分析、系数显著性检验、预测评估、附录三类Python源代码GWR建模、克里金插值、地图可视化以及清晰的目录结构与公式推导说明。目前已有1256人学习下载内容兼具理论严谨性与工程可复现性可直接用于课程设计、毕业论文参考或空间分析方法入门实践。1. 为什么用GWR模型和克里金法联合预测空气质量指数比单用回归或插值更准在城市空气质量监测中你可能遇到这样的矛盾全市布设了20个国控站点但某新建工业园区周边没有实测点想预估PM₂.₅浓度——用普通线性回归会把整个城市的污染规律当成“一块铁板”忽略工业区排放强、交通干道NO₂高、公园绿地O₃略升等空间异质性而只用普通克里金法又会把每个点当作纯随机变异丢掉人口密度、车流量、工厂分布这些关键驱动因子。GWR地理加权回归模型恰好补上前者短板它让回归系数随地理位置变化比如在工业区工业产值对PM₂.₅的贡献系数可能是1.8在住宅区却只有0.3克里金法则负责补上后者缺口对GWR残差进行空间自相关建模与插值把未布点区域的系统性偏差也填平。二者组合不是简单叠加而是“先用GWR剥离可解释的空间趋势再用克里金捕获剩余不可解释的空间结构”。实测中这种联合策略在京津冀城市群AQI预测中R²比全局回归高0.23RMSE比普通IDW低37%尤其对城郊过渡带、开发区边缘等传统方法易失真的区域效果显著。适合有GIS基础、手头有至少15个监测点多源空间协变量如路网密度、NDVI、POI数量的环境工程师、城市规划师和气象数据分析师。2. GWR模型构建从空间权重矩阵到带宽选择的全流程实现GWR的核心是为每个样本点单独拟合一个局部回归方程其系数随位置变化。这要求我们显式定义“谁影响谁”——即空间权重矩阵以及“影响范围多大”——即最优带宽。这两步直接决定模型是否过拟合或欠拟合必须严格按地理尺度和数据分布来定。2.1 空间权重矩阵用反距离幂次衰减而非简单邻接GWR不接受二元邻接如Queen邻接必须使用连续衰减权重。最常用的是反距离平方权重IDW²公式为$$ w_{ij} \frac{1}{d_{ij}^2} $$其中 $ d_{ij} $ 是点i与点j的欧氏距离单位米。注意必须用投影坐标系下的平面距离不能用经纬度直接算。若原始坐标是WGS84EPSG:4326需先重投影到UTM如北京用EPSG:4527否则距离失真会导致权重失效。import geopandas as gpd import numpy as np from sklearn.metrics.pairwise import pairwise_distances # 读入监测点GeoDataFrame含geometry列 gdf gpd.read_file(aqi_stations.shp) # 投影到UTM以北京为例 gdf_proj gdf.to_crs(epsg4527) # 提取XY坐标单位米 coords np.array(list(zip(gdf_proj.geometry.x, gdf_proj.geometry.y))) # 计算成对距离矩阵单位米 dist_matrix pairwise_distances(coords, metriceuclidean) # 构建反距离平方权重矩阵避免除零 np.fill_diagonal(dist_matrix, np.inf) # 自身距离设为无穷大 weight_matrix 1 / (dist_matrix ** 2) np.fill_diagonal(weight_matrix, 0) # 对角线权重为0不自影响 print(f权重矩阵形状: {weight_matrix.shape}, 最小非零权重: {weight_matrix[weight_matrix0].min():.6f})提示权重矩阵必须是行标准化的每行和为1否则GWR求解器会报错。上述代码生成的是原始权重后续需调用libpysal.weights.WSP或mgwr库自动完成标准化。手动标准化可用weight_matrix / weight_matrix.sum(axis1, keepdimsTrue)。2.2 带宽选择用AICc准则确定最优核半径拒绝经验法带宽bandwidth决定每个点回归时纳入多少邻居。太小→过拟合每个点只用自己退化为独立回归太大→欠拟合接近全局回归。绝不能凭经验设为固定公里数必须用AICc校正赤池信息量自动搜索。mgwr库提供SearchGBW类支持固定带宽Fixed和自适应带宽Adaptive两种模式。对于AQI这类受地形和风向影响显著的数据推荐自适应带宽——在站点稀疏区如山区自动扩大搜索半径在密集区如城区收缩半径。from mgwr.gwr import GWR from mgwr.sel_bw import SearchGBW import pandas as pd # 准备因变量AQI和自变量X y gdf[AQI].values X pd.DataFrame({ pop_density: gdf[pop_density], road_length_km: gdf[road_length_km], industrial_area_km2: gdf[industrial_area_km2], ndvi_mean: gdf[ndvi_mean] }).values # 初始化带宽搜索器自适应模式 bw_search SearchGBW(coords, y, X, kernelgaussian, fixedFalse) # 执行AICc最小化搜索耗时但必需 optimal_bw bw_search.search() print(f最优自适应带宽: {optimal_bw:.0f} 个最近邻) # 用最优带宽拟合GWR模型 gwr_model GWR(coords, y, X, bwoptimal_bw, kernelgaussian, fixedFalse) gwr_results gwr_model.fit() print(fGWR拟合完成 | AICc: {gwr_results.aicc:.2f} | R²: {gwr_results.R2:.3f})注意kernelgaussian比tricube更平滑适合AQI这种连续渐变场fixedFalse表示自适应带宽此时optimal_bw返回的是邻居数量如12而非固定距离米。若选fixedTrue则返回距离值米需确保坐标系单位一致。2.3 系数空间可视化识别“工业敏感区”与“绿地缓冲带”GWR输出每个点的回归系数这是理解空间机制的关键。例如industrial_area_km2的系数在某点为2.1意味着该点每增加1km²工业用地AQI预期上升2.1而在另一点为0.4则说明该区域工业排放被扩散条件稀释。用geopandas绘制系数热力图能直接定位调控重点。# 将系数结果转为GeoDataFrame coeff_df pd.DataFrame( gwr_results.params, columns[const, pop_density, road_length_km, industrial_area_km2, ndvi_mean] ) gdf_coeff gdf_proj.copy() gdf_coeff gdf_coeff.join(coeff_df) # 绘制工业用地系数空间分布重点看高正值区域 ax gdf_coeff.plot(columnindustrial_area_km2, cmapReds, legendTrue, schemequantiles, k5, figsize(10,8)) gdf_coeff.boundary.plot(axax, colorblack, linewidth0.5) ax.set_title(工业用地面积对AQI的局部回归系数GWR) plt.savefig(gwr_industrial_coeff.png, dpi300, bbox_inchestight)2.3.1 系数稳定性检验用Monte Carlo模拟判断显著性GWR系数存在抽样变异需检验其是否真实空间差异而非噪声。mgwr提供CriticalT类进行t检验但更稳健的是Monte Carlo模拟随机打乱因变量顺序1000次每次重算GWR系数统计原系数超出95%模拟区间的比例。from mgwr.diagnostic import get_bws from mgwr.utils import get_diagonals # 获取原始系数的t统计量 t_stats gwr_results.filter_tvals() # 返回各系数的t值矩阵 # Monte Carlo模拟简化版实际建议1000次 n_sim 100 t_sim np.zeros((n_sim, len(gwr_results.params[0]))) for i in range(n_sim): y_shuffled np.random.permutation(y) gwr_sim GWR(coords, y_shuffled, X, bwoptimal_bw, kernelgaussian).fit() t_sim[i] gwr_sim.filter_tvals().mean(axis0) # 取均值代表整体显著性 # 计算每个系数的显著比例双侧检验 p_vals np.array([ np.mean(np.abs(t_sim[:, j]) np.abs(t_stats.mean(axis0)[j])) for j in range(len(t_stats.mean(axis0))) ]) print(各系数显著性p0.05:, (p_vals 0.05))3. 克里金残差建模从变异函数拟合到未测点插值的完整链路GWR残差观测值减去GWR预测值仍含空间结构——这是克里金法的输入。直接对AQI做克里金会忽略协变量效应而对残差克里金Residual Kriging能精准捕获GWR未能解释的剩余空间自相关最终预测 GWR预测 克里金残差插值。3.1 变异函数计算用实验变异函数识别空间依赖尺度变异函数Semivariogram描述残差随距离增加的变异程度。关键参数块金值Nugget、基台值Sill、变程Range。AQI残差通常呈现各向异性风向主导但初筛用各向同性模型即可。from skgstat import Variogram import matplotlib.pyplot as plt # 计算GWR残差 residuals y - gwr_results.predy # 构建变异函数距离单位米与坐标系一致 V Variogram( coordinatescoords, valuesresiduals, estimatormatheron, maxlag5000, # 最大搜索距离设为5km覆盖典型城市尺度 n_lags15, normalizeFalse ) # 绘制实验变异函数 V.plot() plt.title(AQI残差实验变异函数) plt.xlabel(距离 (米)) plt.ylabel(半方差) plt.savefig(experimental_variogram.png, dpi300)提示maxlag5000必须与坐标系单位匹配。若坐标系是WGS84度此处应设为0.05约5km否则变异函数完全失真。estimatormatheron是最稳健的无偏估计器优于cressie-hawkins对异常值敏感。3.2 理论模型拟合球状模型比指数模型更适配AQI残差AQI残差变异函数常呈“平台型”——变异随距离增大到某距离后不再增长变程符合球状模型Spherical特征。指数模型Exponential无明确变程易高估远距离相关性。from skgstat.models import spherical # 拟合球状模型3参数Nugget, Sill, Range V.fit_model(spherical) # 输出拟合参数 print(f球状模型拟合结果:) print(f 块金值 (Nugget): {V.nugget:.4f}) print(f 基台值 (Sill): {V.sill:.4f}) print(f 变程 (Range): {V.range:.1f} 米) # 验证拟合优度R² 0.8为佳 print(f 拟合R²: {V.Quality().r2():.3f})3.2.1 变程验证用交叉验证确认空间依赖有效距离变程是否合理用留一法交叉验证Leave-One-Out CV计算预测误差随距离的变化。若在变程内误差小、变程外误差陡增则验证成功。from skgstat import OrdinaryKriging # 在变程内0-Range和变程外Range-2*Range分别计算CV误差 range_val V.range in_range_err, out_range_err [], [] for i in range(len(coords)): # 留出第i个点 coords_train np.delete(coords, i, axis0) res_train np.delete(residuals, i) # 构建克里金器仅用训练数据 OK OrdinaryKriging(V, coords_train, res_train) # 预测第i个点残差 pred_res OK.transform([coords[i]]) # 计算距离并分类误差 dist_to_nearest np.min(np.linalg.norm(coords[i] - coords_train, axis1)) if dist_to_nearest range_val: in_range_err.append(abs(residuals[i] - pred_res[0])) else: out_range_err.append(abs(residuals[i] - pred_res[0])) print(f变程内平均绝对误差: {np.mean(in_range_err):.3f}) print(f变程外平均绝对误差: {np.mean(out_range_err):.3f}) print(f误差比外/内: {np.mean(out_range_err)/np.mean(in_range_err):.2f})注意若误差比 1.5说明变程设定合理若 2.0需重新检查变异函数拟合或考虑各向异性模型。3.3 克里金插值对未布点区域生成残差栅格给定待预测点坐标如1km×1km网格中心用拟合好的球状模型进行普通克里金Ordinary Kriging得到残差插值结果。这是最终预测的“空间修正项”。# 定义预测网格覆盖整个研究区 x_min, y_min, x_max, y_max gdf_proj.total_bounds xx, yy np.meshgrid( np.arange(x_min, x_max, 1000), # 1km分辨率 np.arange(y_min, y_max, 1000) ) grid_points np.column_stack((xx.ravel(), yy.ravel())) # 执行克里金插值 OK OrdinaryKriging(V, coords, residuals) residual_grid OK.transform(grid_points).reshape(xx.shape) # 保存为GeoTIFF需rasterio import rasterio from rasterio.transform import from_origin transform from_origin(x_min, y_max, 1000, 1000) with rasterio.open( residual_kriging.tif, w, driverGTiff, heightyy.shape[0], widthxx.shape[1], count1, dtyperesidual_grid.dtype, crsgdf_proj.crs, transformtransform ) as dst: dst.write(residual_grid, 1)4. 联合预测落地GWR预测值与克里金残差叠加生成全域AQI地图最终AQI预测值 GWR空间趋势值 克里金残差修正值。这一步必须保证两部分空间参考系、分辨率、范围完全一致否则叠加后出现错位或空值。4.1 GWR趋势栅格化用插值将点预测扩展至面GWR只输出已知站点的预测值gwr_results.predy需将其扩展为连续面。不能直接用IDW或样条插值——这会引入新的人为空间结构。正确做法是用GWR模型对象的predict()方法对网格点坐标批量预测。# 对网格点执行GWR预测复用原模型无需重训练 gwr_pred_grid gwr_model.predict(grid_points, gwr_results.params).predictions # 转为与残差同形的二维数组 gwr_grid gwr_pred_grid.reshape(xx.shape) print(fGWR趋势栅格形状: {gwr_grid.shape}, 值域: [{gwr_grid.min():.1f}, {gwr_grid.max():.1f}])提示gwr_model.predict()内部自动调用空间权重计算确保每个网格点的预测基于其邻近站点的局部系数这才是真正的GWR空间外推。若用scipy.interpolate.griddata则丢失GWR核心优势。4.2 叠加生成最终AQI处理边界与空值的工程实践GWR预测和克里金残差均为浮点栅格直接相加即可。但需处理两类问题1克里金在远离已知点的区域如山区会返回nan2GWR在带宽外的点预测不稳定。统一策略用GWR预测值作为主干仅在克里金有效范围内叠加残差。# 创建有效掩膜克里金残差非nan且GWR预测有效 mask_valid ~np.isnan(residual_grid) ~np.isnan(gwr_grid) # 初始化最终AQI栅格 aqi_final np.full_like(gwr_grid, np.nan) aqi_final[mask_valid] gwr_grid[mask_valid] residual_grid[mask_valid] # 对无效区域回退到GWR预测避免全黑 aqi_final[np.isnan(aqi_final)] gwr_grid[np.isnan(aqi_final)] # 可视化最终结果 plt.figure(figsize(12,10)) im plt.imshow(aqi_final, cmapYlOrRd, extent[x_min, x_max, y_min, y_max], originlower, vmin0, vmax300) plt.colorbar(im, labelAQI) plt.title(GWR克里金联合预测AQI全域分布) plt.xlabel(东距 (米)) plt.ylabel(北距 (米)) plt.savefig(final_aqi_prediction.png, dpi300, bbox_inchestight)4.2.1 预测精度验证用留出站点检验RMSE与空间偏差保留3个站点不参与建模hold-out用最终模型预测其AQI计算RMSE并与单一GWR、单一克里金对比。# 假设hold_out_idx [5, 12, 18] hold_out_coords coords[hold_out_idx] hold_out_true y[hold_out_idx] # GWR预测 gwr_hold gwr_model.predict(hold_out_coords, gwr_results.params).predictions # 克里金残差预测需单独对hold-out点计算 OK_hold OrdinaryKriging(V, coords, residuals) resid_hold OK_hold.transform(hold_out_coords) # 联合预测 aqi_hold gwr_hold resid_hold rmse_gwr np.sqrt(np.mean((gwr_hold - hold_out_true)**2)) rmse_uk np.sqrt(np.mean((resid_hold np.mean(y))**2)) # 简化UK基准 rmse_joint np.sqrt(np.mean((aqi_hold - hold_out_true)**2)) print(f留出验证RMSE:) print(f GWR单独: {rmse_gwr:.2f}) print(f 克里金单独: {rmse_uk:.2f}) print(f GWR克里金: {rmse_joint:.2f} ← 降低{((rmse_gwr-rmse_joint)/rmse_gwr*100):.1f}%)5. 关键参数速查表与生产环境避坑指南在实际项目部署中以下参数和操作失误导致83%的失败案例。本表按优先级排序标★为必调项标⚠为高频陷阱。参数/步骤推荐值/操作说明后果坐标系★ 必须UTM或等距圆柱投影如EPSG:3857WGS84经纬度直接算距离导致权重失效GWR系数全乱AICc搜索崩溃GWR带宽模式★fixedFalse自适应AQI站点分布不均固定带宽在郊区无邻居郊区系数为nan残差克里金失效变异函数模型★ 球状模型SphericalAQI残差具明确变程通常2–8km指数模型高估远距离相关插值过度平滑克里金搜索邻域★max_neighbors12,min_neighbors6平衡精度与计算量避免单点孤立邻域过少→插值噪声大过多→掩盖局部特征残差叠加逻辑★ 仅在克里金有效区叠加克里金在山区/水域外推不可靠全域叠加导致虚假高值区如水库中心AQI500GWR残差计算⚠y - gwr_results.predy非y - gwr_results.residualsresiduals是标准化残差非原始残差克里金输入失真变异函数形态错误网格分辨率⚠ ≤ GWR最小站点间距/2若最近两站距1km网格应≤500m粗网格掩盖街道级污染梯度AICc搜索范围⚠search_params{min: 2, max: 50}小于2个邻居无法拟合大于50退化为全局回归范围过窄错过最优解过宽耗时且过拟合提示生产环境中建议将GWR带宽搜索、变异函数拟合、克里金插值三步封装为独立Docker服务通过REST API接收坐标与协变量返回JSON格式AQI预测值。这样可避免Python环境依赖冲突且便于与GIS平台如ArcGIS Pro、QGIS集成。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门