我有一个包含 140.000 点(行)的 csv 文件。它包括:
- 经度值
- 纬度值
- 特定点的沉降值。我假设这些点在空间上相关。
我想对点的面积进行空间插值分析。这意味着,我将使用克里金法(即高斯过程回归)进行地统计插值分析。
我正在sci-kit learn页面上阅读有关高斯回归的内容。但我不确定如何实现它。
哪些特征决定了我可以使用哪个内核?如何使用我的空间数据正确实现这一点?
最佳答案
首先,您应该将数据转换为投影坐标系。最好的方法取决于您的数据所在的位置;本质上,您希望您的位置具有最小失真量的等角投影(例如,赤道附近的墨卡托投影,或者横轴墨卡托投影,如果您的数据都靠近单个子午线)。您可以在geopandas
中实现这一点示例:
import pandas as pd
import geopandas as gpd
data = {'latitude': [54, 56, 58], 'longitude': [-62, -63, -64], 'subsidence': [10, 20, 30]}
df = pd.DataFrame(data)
params ={
'geometry': gpd.points_from_xy(df.longitude, df.latitude),
'crs': 'epsg:4326', # WGS84
}
gdf_ = gpd.GeoDataFrame(df, **params)
gdf = gdf_.to_crs('epsg:2961') # UTM20N
gdf
此 GeoDataFrame
现在位于投影坐标中。现在您可以进行一些空间预测:
import numpy as np
from sklearn.gaussian_process.kernels import RBF
from sklearn.gaussian_process import GaussianProcessRegressor
kernel = RBF(length_scale=100_000)
gpr = GaussianProcessRegressor(kernel=kernel)
X = np.array([gdf.geometry.x, gdf.geometry.y]).T
y = gdf.subsidence
gpr.fit(X, y)
现在您可以预测某个位置,例如gpr.predict([(500_000, 5_900_000)])
为我的玩具数据提供 array([22.86764555])
。
要在网格上进行预测,您可以这样做:
x_min, x_max = np.min(gdf.geometry.x) - 10_000, np.max(gdf.geometry.x) + 10_000
y_min, y_max = np.min(gdf.geometry.y) - 10_000, np.max(gdf.geometry.y) + 10_000
grid_y, grid_x = np.mgrid[y_min:y_max:10_000, x_min:x_max:10_000]
X_grid = np.stack([grid_x.ravel(), grid_y.ravel()]).T
y_grid = gpr.predict(X_grid).reshape(grid_x.shape)
需要考虑的事情:
- 您应该阅读
geopandas
的文档和sklearn.gaussian_process
- 您应该使内核适合您的数据。
- 您可能想使用各向异性内核。
- 估算器有一些您应该注意的超参数。
- 不要忘记对您的估算进行一些验证,检查残差的分布等。
- 您可能需要使用专业的地质统计软件包,例如
gstools
,这将为您做很多繁琐的事情。
关于artificial-intelligence - 高斯过程回归的空间插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68624554/