我有一个140.000 点(行)的csv 文件。它包括:
- 经度值
- 纬度值
- 特定点的沉降值。我假设这些点在空间上是相关的。
我想对点的区域进行空间插值分析。意思是,我将使用例如克里金法(即高斯过程回归)进行地统计插值分析。
我正在阅读关于高斯回归的sci-kit 学习页面。但我不确定如何实现它。
哪些特性决定了我可以使用哪个内核?如何正确使用我的空间数据实现这一点?
我有一个140.000 点(行)的csv 文件。它包括:
我想对点的区域进行空间插值分析。意思是,我将使用例如克里金法(即高斯过程回归)进行地统计插值分析。
我正在阅读关于高斯回归的sci-kit 学习页面。但我不确定如何实现它。
哪些特性决定了我可以使用哪个内核?如何正确使用我的空间数据实现这一点?
首先,您应该将数据转换为投影坐标系。最好的取决于您的数据所在的位置;本质上,您希望在您的位置(例如赤道附近的墨卡托,或者如果您的数据都接近单个子午线,则为横轴墨卡托)进行变形最小的保形投影。您可以通过以下方式实现此目的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
,它会为您做很多繁琐的事情。