有没有办法自动分割大于某个最大点数的大簇?

问题描述 投票:0回答:1

我在这些坐标上运行 HDBSCAN 并得到一些簇,但有些簇太大。 HDBSCAN 有最小簇大小参数,但没有最大大小。我想要的只是直观地划分较大的簇,以便没有一个簇大于最大簇大小。本质上,这是创建下面第二个图的东西。我可以在集群上重新运行 HDBSCAN,但不能保证减小大小。我可以使用 k 均值,但我在最短路径距离矩阵上使用聚类,我认为 k 均值无法处理。

cl = gpd.read_file("cluster.gpkg")

df = pd.concat([cl.geometry.x, cl.geometry.y], axis = 1)

mins = 40
min_size = 400

clusterer = hdbscan.HDBSCAN(min_cluster_size=min_size, min_samples=mins, allow_single_cluster=True) 
clusterer.fit(df.iloc[:, 0:2])
pd.Series(clusterer.labels_).value_counts()

df['cluster'] = clusterer.labels_
df['subcluster'] = np.nan

# Plot
plt.figure(figsize=(10,6))

unique_labels = np.unique(clusterer.labels_)
noise_data = df[df['cluster'] == -1]


fig, ax = plt.subplots(1, 2, figsize=(20,6)) # Create 1 row, 2 columns of plots

for label in unique_labels:
    subset = df[df['cluster'] == label]
    if label == -1:
        ax[0].scatter(subset[0], subset[1], label="Noise", color='gray', marker=".", alpha=0.3)
    else:
        ax[0].scatter(subset[0], subset[1], label=f'Cluster {label}', marker = ".", alpha=1)

ax[0].set_xlabel('Longitude')
ax[0].set_ylabel('Latitude')
ax[0].set_title('Clusters')
ax[0].legend()
python gis cluster-analysis qgis dbscan
1个回答
0
投票

看看这个PR,它在源代码中添加了这个参数。它们似乎就是您所追求的,尽管它们很难找到,正如本问题中所述。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.