如何使用聚类根据高程对 2D 空间格网数据进行分组:聚类必须是连续的

How to group 2d spatial grid data based on their elevation using clustering: clusters have to be contiguous

提问人:tincan 提问时间:11/16/2023 更新时间:11/18/2023 访问量:28

问:

enter image description here

我有 2D 格网数据,我想根据高程进行分组,但聚类必须是连续的,并且在 (4) 中具有最少的数据数。聚类的可视化表示形式如下所示:

谢谢!

gridded data with clusters

python scikit-learn 聚类分析

评论

1赞 Matt Hall 11/17/2023
聚类分析会查找在您为算法提供的任何特征中连续的事物。因此,除了 z(海拔)之外,还给它 x 和 y。但是要谨慎选择算法,因为它们都有自己的弱点,例如 k-means 想要大小大致相等的集群。看看这个 scikit-learn.org/stable/auto_examples/cluster/...

答:

0赞 louis 11/17/2023 #1

编辑 - Matt 对 K-Means 提出了一个很好的观点......还添加了光谱聚类。

由于每个点都没有标签,只是在空间中的位置,因此您可以将其视为无监督学习问题,并使用 K-Means 创建聚类。

聚类将是连续的,因为 2D 格网上的每个点都将分配给一个且只有一个聚类。如果希望边界仅是垂直线和水平线,就像在绘图中一样,则可以获取 K-Means 的最终预测,并将它们用作决策树中的标签,其中唯一的特征是 x 和 y。

import pandas as pd
import numpy as np
import math
from sklearn.cluster import KMeans

grid_size = 100
grid = [[row, column, 75 * math.sin(row/25) * math.sin(column/25)] for row in range(grid_size) for column in range(grid_size)]
elevations = pd.DataFrame(grid, columns = ['x', 'y', 'z'])

clf = KMeans(n_clusters=4, random_state=0, n_init=10)
clf.fit(elevations)
centers = clf.cluster_centers_

predictions = clf.predict(elevations)
predictions = predictions.reshape(grid_size, grid_size)

plt.imshow(predictions, interpolation='nearest',
           extent=(0, grid_size, 0, grid_size),
           cmap=plt.cm.Pastel1,
           aspect='auto', origin='lower')

plt.scatter(elevations['x'], elevations['y'], c = elevations['z'], s=1)

plt.scatter(centers[:, 0], centers[:, 1],
            marker='x', s=100, linewidths=3,
            color='w', zorder=10)

Initial Elevation Map K Means Spectral