☰
多尺度地理加权回归MGWR实战:Python从原理到结果解读
2026/10/3 3:26:00 网站建设 项目流程

1. 从全局回归到多尺度地理加权回归:为什么MGWR值得学

先聊一个我自己的经历。前几年做城市房价影响因素分析,用普通最小二乘回归跑出来的结果很规整,R方也不低,但画完残差空间分布图之后,后背发凉:残差在空间上明显聚集,老城区一片红,新区一片蓝。这说明一个根本问题——全局回归假设影响因素对因变量的作用在空间各处是均质的,但地理现象几乎从来不是这样。学区对房价的影响在老城区和新区完全不同,地铁站的作用在核心区和边缘区也不同。这种空间非平稳性,才是地理数据的常态。

这时候就该上地理加权回归(GWR)了。GWR的基本思想不复杂,它对每个样本点单独拟合一套系数,样本位置不同,系数也不同。它解决的核心问题是:让模型自己"看到"空间上下文。系数在哪个区大、在哪个区小,就能告诉你这个因素的作用在空间上是如何变化的。

但GWR有个隐含假设:所有自变量都共享同一种空间尺度,也就是同一个带宽。所谓带宽,可以理解成回归时使用的"局部邻域有多大"。GWR用单一带宽去拟合所有变量,等于假设房价、地铁距离、学校密度这些因素在影响房价时,作用尺度全都一样。这显然不符合真实世界——地铁对房价的影响可能涉及几公里范围,而社区绿化率的有效作用半径可能只有几百米。

多尺度地理加权回归(MGWR)就是为了打破这个限制。它允许每个解释变量拥有自己的带宽,由数据本身去确定"哪个变量在较大尺度上起作用,哪个变量在较小尺度上变化"。这既保留了GWR的局部拟合能力,又能进一步回答"变量的空间作用尺度"这一层问题。Python生态里用mgwr包实现这条路已经相当成熟,而且配合geopandas、matplotlib能做出很漂亮的分析链条。

这篇文章我会按实际使用的流程来写:原理讲到够用的深度,代码直接可用,结合作者踩过的坑提醒你关键节点。适合刚接触GWR/MGWR的GIS和数据方向从业者,也适合那些已经在ArcGIS里点过GWR工具、想转向Python做更灵活分析的读者。后面涉及的内容较多,建议按自己不熟的部分跳读。

2. 理解MGWR的精髓:带宽、局部回归与后拟合标定

2.1 从GWR到MGWR:模型形式的差异

先看GWR的模型形式,这样对比容易理解:

y_i = β0(u_i, v_i) + Σ_k βk(u_i, v_i) x_ik + ε_i

其中(u_i, v_i)是第i个样本点的坐标,βk是第k个变量在位置i处的系数。GWR通过在每个样本位置做加权最小二乘,给离i越近的样本赋予越高的权重。权重是带宽的函数,常见的核函数有bi-square和gaussian两种,bi-square在带宽之外权重直接为0,gaussian则随距离递减但不会截断。

MGWR的公式可以写成:

y_i = β0(u_i, v_i) + Σ_k βk(u_i, v_i) x_ik + ε_i

表面上形式一样,区别在背后的标定方式:GWR的所有βk共享同一个带宽b,而MGWR允许每个βk拥有自己的带宽b_k。也就是说,模型会估计出一组带宽,可能地铁距离变量的带宽是2.5公里,绿化率变量的带宽是800米。这个结果本身就包含信息:带宽越大,说明该变量在更大的空间范围内保持稳定,接近"全局性";带宽越小,说明它只在很小的邻域内变化,局部性很强。

2.2 "多尺度"里面的尺度,到底是尺度还是带宽

很多初学者会把"多尺度"理解成多分辨率数据或不同图层粒度,其实MGWR里的尺度特指"空间作用范围",用带宽作为实际表现。带宽是核函数中控制权重衰减快慢的参数,可以简单理解为一个"有效半径"。模型在估计某一点的系数时,主要参考该半径内样本的信息。

这里有个容易误解的点:MGWR并没有把空间划分成几个尺度区间,而是用连续带宽来表达每个变量的尺度特征。输出结果中每个变量有一个最优带宽数值,分析者可以根据这些数值判断变量的空间过程是偏全局还是偏局部。通常,如果某个变量的最优带宽接近样本数量(或者说接近整个研究区域范围),可以理解为该变量在全局尺度上作用,系数几乎不因位置变化。

在Python的mgwr输出中,参数表会列出每个变量的带宽以及标定的"尺度比例"之类的统计量。利用这个结果,你可以构造带宽柱状图直接展示不同影响因素的作用尺度差异,这在撰写论文或分析报告时很加分。

2.3 后拟合算法:MGWR是怎么估计参数的

MGWR的估计不像GWR那样可以通过矩阵运算一步得到,它的核心是后拟合(back-fitting)算法。你可以把后拟合理解成"逐个变量轮流优化"的过程:先固定其他变量的系数和带宽,只更新第一个变量的系数;然后固定其余变量,更新第二个变量的系数;重复多轮,直到所有系数不再明显变化。

这种算法源自加性模型的拟合思想,好处是能处理多个变量带宽不一致的问题,代价是计算量大幅上升,而且对初始带宽和初始系数比较敏感。实际操作中,MGWR的带宽初值通常由全局GWR的带宽或者用户指定的数值范围来初始化,然后通过迭代优化。这也意味着同样的数据,不同的初始设置可能得到有细微差异的结果,不是bug,而是这类算法的内在特点。

因此我的建议是:不要把MGWR当作一个黑盒,跑完直接抄结果。至少要做两轮不同初值的估计,对比带宽和系数的稳定性,再下结论。

3. Python环境搭建与数据准备:80%的问题出在这一步

3.1 安装mgwr及配套库

MGWR在Python中的核心库是mgwr,它隶属于pysal地理空间分析库家族,依赖libpysal、spglm等模块。我用conda创建独立环境的方式,避免污染其他项目:

conda create -n mgwr python=3.9 conda activate mgwr pip install mgwr geopandas shapely matplotlib scikit-learn

如果你之前已经装过pysal全家桶,那基本只缺mgwr:

pip install mgwr

安装过程中最容易出坑的是libpysal和其它空间库的版本兼容问题。如果import报错提示找不到某个模块,优先尝试升级libpysal和spglm:

pip install --upgrade libpysal spglm esda

必须提醒的一点,mgwr包目前不算活跃,在一些新Python版本上可能存在依赖编译问题,用3.9或3.10版本最稳。用conda管理环境不只是为了干净,更重要的是好回滚——依赖冲突时直接删掉环境重建,比自己折腾系统环境省时得多。

3.2 数据格式:什么样的数据才能跑MGWR

MGWR的输入数据结构说简单也简单,说麻烦也麻烦。你需要准备以下几样东西:

  • 一个二维数组y,形状为(n_samples, 1),表示因变量;
  • 一个二维数组X,形状为(n_samples, n_features),表示自变量(通常不包含截距项,mgwr会自动加截距);
  • 一个二维坐标数组coords,形状为(n_samples, 2),表示每个样本的空间坐标(一般为投影坐标系的x、y,不要用经纬度,除非你的研究范围很小且你清楚投影误差的影响)。

你需要的是样本级别的数据,每一行一个样本,每一列一个变量。它不像栅格那样需要邻域结构,因为空间权重完全由样本间的距离计算。所以本质上你可以用任何来源的数据,只要带上坐标并且做一遍清洗即可。

比较省心的做法是直接从GeoDataFrame开始,比如读一个Shapefile或GeoJSON:

import geopandas as gpd gdf = gpd.read_file("your_data.shp") gdf = gdf.dropna(subset=["price", "subway_dist", "school_density"]) # 计算投影坐标(这里选用适合你研究区的投影) gdf = gdf.to_crs("EPSG:3857") coords = list(zip(gdf.geometry.x, gdf.geometry.y)) y = gdf[["price"]].values.astype(float) X = gdf[["subway_dist", "school_density", "green_cover"]].values.astype(float)

注意三个细节:

  1. 一定要剔除含有空值的行。MGWR对缺失值没有自动处理能力,NaN进入模型一般会直接报错。
  2. 使用投影坐标而不是经纬度。因为MGWR的距离计算基于欧氏距离,经纬度带来的距离变形在投影坐标系下会小很多。
  3. 量纲问题最好先做标准化。MGWR的back-fitting过程对变量尺度有一定敏感性,虽然理论上模型能自己调节,但实践中标准化后的收敛更稳、结果更易解释。用sklearn的StandardScaler处理X即可,后面解释系数时再按缩放比例还原。

3.3 变量选择与共线性前置检查

MGWR比GWR更敏感于解释变量之间的多重共线性。原因在于当带宽不同时,某些局部区域可能出现严重的局部共线性,也就是变量在该区域内的局部变异高度重叠,导致系数出现反常的大正值或负值。这不是MGWR的缺陷,而是空间回归中普遍存在的数据病。

因此,在跑MGWR之前,至少做两件事:

  • 计算变量间的方差膨胀因子(VIF),把VIF大于10的变量剔除或合并;
  • 用GWR跑一次基线模型,看局部系数的取值范围是否异常宽泛。如果GWR系数在空间上出现剧烈正负交替,往往说明共线性或带宽不合理,这时候直接跑MGWR只会让问题更隐蔽。

我习惯先用相关性热图做快速筛查,再上VIF,最后用GWR做基线。整个过程半小时能完成,但能避免后面很多解释上的尴尬。

4. 完整实战:用Python跑一个MGWR模型

4.1 构造或加载案例数据

为了演示完整流程,我这边就不贴某个具体城市的真实数据分析结果了,而是采用一个结构化的模拟数据集。真实项目里,你只需要把数据读取部分替换成自己的业务数据即可。

模拟场景是某城市约500个小区的二手房交易数据,目标变量是"成交单价",解释变量包括"到地铁站距离"、"周边学校密度"、"绿化率"和"容积率"。数据生成时人为设置了不同的作用尺度:地铁距离在大尺度上影响房价,学校密度在中尺度,绿化率在小尺度,容积率接近全局。这样可以体现MGWR的优势。

import numpy as np import pandas as pd np.random.seed(42) n = 500 x_coord = np.random.uniform(0, 100, n) y_coord = np.random.uniform(0, 100, n) subway_dist = np.abs(np.random.normal(50, 20, n)) school_density = np.random.gamma(2, 2, n) green_cover = np.random.uniform(0, 1, n) floor_rate = np.random.normal(2.5, 0.8, n) # 不同变量在不同空间位置上的真实系数 b_subway = -0.002 + 0.0003 * x_coord b_school = 0.5 + 0.2 * np.sin(0.1 * y_coord) b_green = 2.0 * (1 - np.abs(x_coord - 50) / 50) b_floor = -0.8 price = (50 + b_subway * subway_dist + b_school * school_density + b_green * green_cover + b_floor * floor_rate + np.random.normal(0, 2, n)) df = pd.DataFrame({ "x": x_coord, "y": y_coord, "price": price, "subway_dist": subway_dist, "school_density": school_density, "green_cover": green_cover, "floor_rate": floor_rate })

这段代码只是为了演示,真实业务数据至少千级别以上,且需要仔细解决采样偏差问题。MGWR对样本覆盖密度较敏感,如果某些区域样本过少,局部系数估计会变得很不稳定,这是后面检查结果时重点要看的。

4.2 推荐先从GWR开始:同一套数据的"基线"

任何MGWR分析都应该先跑GWR。这句话值得强调。GWR的结果有两个用途:一是作为模型对比的基线,二是为MGWR提供合理的初始带宽。GWR的运行时间远低于MGWR,先跑它成本很低。

from mgwr.gwr import GWR from mgwr.sel_bw import Sel_BW y = df[["price"]].values X = df[["subway_dist", "school_density", "green_cover", "floor_rate"]].values coords = list(zip(df["x"], df["y"])) # 标准化一下,减少量纲影响 from sklearn.preprocessing import StandardScaler X_scaled = StandardScaler().fit_transform(X) # 选择GWR带宽 gwr_selector = Sel_BW(coords, y, X_scaled, kernel="bisquare") gwr_bw = gwr_selector.search() print("GWR最优带宽:", gwr_bw) # 拟合GWR模型 gwr_model = GWR(coords, y, X_scaled, gwr_bw, kernel="bisquare") gwr_results = gwr_model.fit() print(gwr_results.summary())

这里的关键是带宽选择。sel_bw默认用AICc准则搜索带宽,你也可以用交叉验证(CV)。实际使用中AICc的结果更平滑,CV的结果更偏向预测导向,两者在数据量较大时差异不大。带宽搜索是一个较耗时的过程,尤其样本量上几千之后,建议先跑一次小范围搜索,比如使用bw参数指定候选范围,避免全量网格搜索带来的等待。

我还建议你把kernel参数固定在"bisquare"。因为bi-square核函数在带宽外权重直接归零,计算效率和可解释性都更好,gaussian核虽然平滑但每个点的计算都要考虑全部样点,慢很多,而且带宽膨胀时结果难解释。

4.3 跑通MGWR:模型拟合与常见报错排查

接着用GWR的带宽作为MGWR初始带宽的参照,跑MGWR:

from mgwr.mgwr import MGWR from mgwr.sel_bw import MGWRSelector # MGWR带宽优化器,multi_bw参数用来指定每个变量的初始带宽范围 mgwr_selector = MGWRSelector(coords, y, X_scaled, kernel="bisquare") # 先用GWR带宽作为所有变量的公共初始带宽 mgwr_selector.multi_bw = [gwr_bw] * X_scaled.shape[1] mgwr_bws = mgwr_selector.search() print("MGWR各变量带宽:", mgwr_bws) # 拟合MGWR mgwr_model = MGWR(coords, y, X_scaled, mgwr_bws, kernel="bisquare") mgwr_results = mgwr_model.fit() print(mgwr_results.summary())

有一个API细节需要注意:不同版本的mgwr在MGWRSelector的初始化参数上略有变化,有些版本要求传入multi_bw作为初始值,有些版本接受默认值再手动赋值。跑之前建议先看一眼函数签名:help(MGWRSelector)。我遇到过不少读者按网上旧教程跑,结果在MGWRSelector(...)这一步就报错,多半就是版本差异。

MGWR拟合过程中的常见报错有这么几类,我按出现频率排一下:

  • 输入数组维度不对。y必须是二维,形状为(n,1),而不是一维(n,)。X不要包含全为常数的列,否则会跟截距项冲突。
  • 带宽选择器搜索过程不收敛。通常是因为变量标准化不到位或样本太少。把数据标准化,加大迭代上限。
  • 内存不足。MGWR在后拟合过程中需要反复计算空间权重矩阵,样本超过5000后内存压力陡增。这时可以尝试减少自变量数量,或者改用gaussian核配合稀疏矩阵方式处理(但mgwr官方支持有限)。

拟合完成后,summary()会输出一大段结果,包括每个变量的带宽、局部系数的均值/标准差/最小值/最大值、模型的AICc、R2等。下面围绕怎么读这段输出专门写一节。

5. 读懂MGWR结果:带宽对比、系数解读与显著性判断

5.1 先看带宽,再看系数:秩序很重要

拿到MGWR结果后,我建议不要第一时间看系数均值,先把带宽表梳理出来。带宽告诉你的是"尺度故事":哪些变量在多大空间范围内起作用。

你可以手工提取每个变量的带宽:

bw_df = pd.DataFrame({ "variable": ["subway_dist", "school_density", "green_cover", "floor_rate"], "bandwidth": mgwr_results.bw }) print(bw_df)

在这个模拟案例里,预期的结果是:subway_dist的带宽接近200以上(大尺度),green_cover带宽较小,floor_rate带宽很大甚至接近样本数。这种差异正是MGWR相对GWR的核心增量信息。

如果某个变量的带宽小到只有几个样本点,你要警惕:这个变量在很局部的范围内剧烈变化,局部系数估计可能不稳定。如果某个变量的带宽大到覆盖所有样本,这个变量基本等价于回归中的"全局变量",它的系数在空间上变化很小。

5.2 系数的空间分布:提取并绘制系数地图

用MGWR模型可以拿到所有样本点的局部系数,形状为(n, k+1),第一列是截距项。提取并写回GeoDataFrame:

params = mgwr_results.params # 形状 (n, 4) tvalues = mgwr_results.tvalues gdf["b_subway"] = params[:, 1] gdf["b_school"] = params[:, 2] gdf["b_green"] = params[:, 3] gdf["b_floor"] = params[:, 4] # 显著性标记:一般 |t| > 1.96 近似为显著 sig_subway = np.abs(tvalues[:, 1]) > 1.96 gdf["sig_subway"] = sig_subway

画系数地图时,我建议用quantiles分类而不是等间距分类,因为局部系数的分布往往偏态,等间距会掩盖空间模式。做法很简单:

import matplotlib.pyplot as plt fig, axes = plt.subplots(2, 2, figsize=(12, 10)) for ax, col in zip(axes.flatten(), ["b_subway", "b_school", "b_green", "b_floor"]): gdf.plot(column=col, scheme="quantiles", k=5, cmap="RdBu_r", legend=True, ax=ax) ax.set_title(col) ax.set_axis_off() plt.tight_layout() plt.savefig("mgwr_coef_maps.png", dpi=200)

画图时还有一个细节:如果系数有正有负,使用RdBu这类发散色带并设置对称的色标范围,不然颜色会误导读者。具体做法是计算全部系数绝对值的最大范围,然后设定vmin和vmax为对称值。

不同变量使用相同图例范围对比更公平,但有时变量系数本身数量级差异很大,硬套统一范围会损失细节。我的习惯是分两种情况:做展示图时每个变量用各自合适的范围,但要在图题注明;做严谨对比时使用统一range,并配箱线图说明分布。

5.3 显著性判断:不显著的区域别硬解释

MGWR结果里一个常被忽略的点是:局部系数的显著性。很多分析者在论文里画出系数变化图就完事,却没有区分哪些区域的系数是统计显著的。结论的可靠性会打折扣。

mgwr的results对象提供了tvalues属性,可以直接用来判断局部系数的显著性。使用方式见上面的代码。绘制时可以将不显著的样本点做空心化处理,只填充显著样本点,可以更清楚地看出显著性空间结构。

另外要注意,局部检验存在多重检验问题,严格的研究会做FDR校正。虽然这不是必须操作,但如果你的结论高度依赖某些区域的显著性,建议用p值校正的方法复核一下。简单起见,可以直接用statsmodels里的multipletests函数。

from statsmodels.stats.multitest import multipletests pvalues = 2 * (1 - stats.norm.cdf(np.abs(tvalues[:, 1]))) _, p_corrected, _, _ = multipletests(pvalues, method="fdr_bh") gdf["sig_subway_fdr"] = p_corrected < 0.05

这样处理后的显著性地图会稳健很多,审稿人或业务方的质询也能扛得住。

6. 带宽搜索的效率问题:样本规模、计算时间与优化策略

MGWR最让人烦躁的问题就是慢。数据量到达几千条以后,一次完整的MGWR带宽搜索加模型拟合,可能从几分钟到几十分钟不等。为了不被漫长的等待消磨耐心,有几个实际可用的优化技巧。

第一,把带宽搜索的候选范围缩小。如果你已经跑了GWR,得到全局最优带宽为gwr_bw,那么MGWR各个变量的带宽大概率不会偏离GWR带宽太多。在MGWRSelector里传入搜索范围时,可以限制在gwr_bw乘以0.5到1.5倍区间。比如希望带宽从20搜索到400,可以用range参数或相应的初始化方法限定候选列表。

第二,先用一小部分样本做一次"预演"。比如随机抽取20%的样本,先跑通流程并得到一个粗略的带宽搜索范围,再用全量数据在该范围内精细搜索。这个方法不能直接用于最终结果,因为样本数量对带宽有影响,但可以有效排查代码问题、估计耗时。

第三,合理选择核函数。bi-square核让距离超过带宽的样本权重变为0,这样在局部拟合时只需要计算带宽内的样本,整体开销远低于gaussian核。大量实测下来,bi-square的时间优势非常明显,且结果差异几乎不影响解释。

我在一个约3000条记录的项目里做过粗略测试:gaussian核的MGWR带宽搜索耗时接近40分钟,而换成bisquare核后直接降到12分钟。如果你的数据还在不断增长,强烈建议选择bi-square。

如果你确实需要在大规模数据上跑MGWR,还可以考虑并行化思路。mgwr自带的多进程支持目前比较有限,但带宽搜索本身是串行依赖的,不好直接并行。一个可行的变通办法是把研究区域按子区切分,每个子区独立建模,然后对比子区之间的参数稳定性。这不算标准的MGWR多尺度全局拟合,但在业务场景中常常是实用性优先的选择。

7. 结果解释中的常见陷阱:多尺度不等于多分辨率

MGWR给了每个变量一个带宽,很容易让人陷入一个解释误区:把"带宽大小"直接等同于"影响因素重要性"。这两个概念不能混为一谈。带宽描述的只是"空间尺度",也就是作用范围的大与小;重要性描述的是"强度",比如系数绝对值的大小。一个变量的带宽可以很大,但它对因变量的作用可能非常微弱;反之,一个变量带宽很小,局部作用强,却只影响一小撮样本。

以房价为例,"到地铁站距离"可能拥有很大的带宽,表示它的影响范围跨越全市,"小区物业费"可能带宽很小,只影响周边一两公里。但二者的系数强度可能完全不同。解释时要分开报告:"该变量在xx尺度上空间变化,系数变化范围为...,其中xx区域作用最强。"不要笼统说"带宽越大越重要"。

第二个常见坑是对带宽数值的直接外推。MGWR得到的带宽是针对当前样本点的邻域尺度,它依赖于样本分布密度。样本点密集的区域,局部信息充足,带宽可能偏小;样本点稀疏的区域,为了获得足够的局部估计信息,带宽会偏大。也就是说,带宽数值里混杂了数据采样密度的影响。跨区域对比不同研究的MGWR带宽时,务必谨慎。

第三个坑是过度解释系数的局部符号变化。如果一个变量的局部系数在某个区域显著为正,在另一个区域显著为负,这确实能说明该变量的作用方向发生变化,但必须先验证是否由局部共线性导致。一个简单检查方式是,对符号变化剧烈的变量绘制与其它变量的相关系数局部地图,观察是否在符号变化区域出现相关性突变。

我在审阅相关分析报告时,还习惯做一个敏感性检查:删去最相关的另一个变量后重新跑MGWR,看目标变量的带宽和系数图是否发生明显改变。如果明显改变,说明结果受到变量组构成的影响,结论需要更保守地表达。

8. 把MGWR写进报告:需要配齐哪些图表和数据

到了实际汇报或写论文这一步,不少人的模型跑得很好,但不知道怎么把结果呈现得让人信服。按照我的经验,一份完成度高的MGWR分析报告至少要包含以下内容。

首先是GWR和MGWR的对比表。表中列出两者的带宽数、AICc、R2、调整R2、残差平方和以及各自的最优带宽范围。这个对比的核心价值是说明"我们用了多尺度模型,而且它确实比单尺度GWR更好"。

其次是带宽条形图,展示每个变量的带宽,并按从小到大排序。带宽条形图能让读者一眼看出哪些变量是全局性的,哪些是局部性的。如果有的变量带宽趋近样本总量,建议在图中特别标注"近似全局变量"。

第三是系数空间分布图。每个解释变量一幅图,按分位数划分色级,叠加上显著性标记。图名不要直接用变量代码,要写业务含义,比如"到地铁站距离的影响系数"。

最后,建议附一段结果解读文字。避免罗列统计量,而是讲故事:模型发现哪些变量在局地尺度上变化、哪些变量相对稳定、显著区域的空间格局意味着什么。一个好的MGWR分析并不止于得出"系数在空间上变化",更要回答"这种变化背后的城市规划/交通/人口结构因素是什么"。

我习惯把报告的结论部分限定在"从数据中看到的现象"和"需要结合专业知识解释的现象"两层,不强行给出因果判断。空间回归模型说明的是空间相关模式,不是因果机制。这一点在公开写作时特别重要。

9. 写在后面:先用GWR打底,再让MGWR说话

跑过几十次MGWR之后,我最深的体会是:MGWR不是替代GWR的神器,而是GWR的升级补充。它更适合用来回答"除了空间非平稳性,是否存在多尺度效应"这个问题。如果你只是想得到一套平滑的局部系数地图,GWR已经够用;如果想把"不同变量的作用尺度差异"也纳入结论,才轮到MGWR登场。

实际操作中,我的标准流程始终是:OLS打底、GWR优化、MGWR深化。先看OLS残差有没有空间自相关,再跑GWR确定是否存在空间非平稳性,最后用MGWR解释这种非平稳性是否来源于多尺度过程。每一层模型都在回答不同层次的问题,这样出来的结论逻辑完整,也经得起业务或学术上的质疑。

一个小技巧作为收尾:跑MGWR时把每次带宽搜索和模型拟合的中间结果都保留下来,特别是GWR的带宽和AICc。因为不同项目之间需要反复对比,这些中间数据能帮你在模型结果异常时快速定位到底是数据问题还是初始参数问题。毕竟地理加权回归这类模型,数据的质量和模型初值的选择,往往比算法本身的差异更能影响最终结论。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询