1

我一直在用(x,y)点“point_coord”的小实例从scikit learn包中测试hdbscan,结果集群对我来说真的没有意义。鉴于样本量小,我允许单个集群。

我预计会有两个集群:第 4 点和第 5 点聚集在一起,而其余点则聚集在一起。

point_coord=[[0,0],[1,1],[0,1],[50,40],[50,45],[2,3],[1,2]]

test=pairwise_distances(point_coord)

clusterer= hdbscan.HDBSCAN( allow_single_cluster=True,                
metric='precomputed')

clusterer.fit(test)

但是,生成的 clusterer.labels 是:

[-1, 0, 0, 0, -1, 0, 0]

4

2 回答 2

2

您需要考虑以下几点:

1 - HDBSCAN 是一种噪声感知聚类算法。因此,输出中的 -1 结果是被视为异常值并从聚类中排除的数据。从 文档

重要的是 HDBSCAN 具有噪声感知能力——它具有不分配给任何集群的数据样本的概念。这是通过为这些样本分配标签 -1 来处理的

2 - 数据集非常小,未设置min_samplesmin_cluster_size参数。因此 HDBSCAN 使用将最小集群大小设置为 5 的默认参数。您可以在 clusterer.fit(distance_matrix)命令输出中检查使用的参数。

HDBSCAN(algorithm='best', allow_single_cluster=False, alpha=1.0,
        approx_min_span_tree=True, cluster_selection_method='eom',
        core_dist_n_jobs=4, gen_min_span_tree=False, leaf_size=40,
        match_reference_implementation=False, memory=Memory(location=None),
        metric='precomputed', min_cluster_size=5, min_samples=None, p=None,
        prediction_data=False) 

请参阅文档(HDBSCAN 的参数选择)以了解如何正确配置算法。

这是带有集群树状图的代码的更正版本。

point_coord=[[0,0],[1,1],[0,1],[50,40],[50,45],[2,3],[1,2]]
distance_matrix=pairwise_distances(point_coord)
clusterer= hdbscan.HDBSCAN(metric='precomputed', min_samples=1,min_cluster_size=2)
clusterer.fit(distance_matrix)
print(clusterer.labels_)
clusterer.single_linkage_tree_.plot()

输出:在此处输入图像描述

于 2019-08-19T14:42:58.777 回答
1

你能试试:

from sklearn.cluster import KMeans
import numpy as np
X = np.array(point_coord)
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
kmeans.labels_

输出:array([1,1,1,0,0,1,1])

我同意它应该是这样的: (0, 0, 0, 1, 1, 0, 0)

于 2019-08-14T05:45:49.367 回答