sklearn:从点到最近的集群获取距离

Posted

技术标签:

【中文标题】sklearn:从点到最近的集群获取距离【英文标题】:sklearn: Get Distance from Point to Nearest Cluster 【发布时间】:2017-10-17 21:21:18 【问题描述】:

我正在使用像 DBSCAN 这样的聚类算法。

它返回一个名为-1 的“集群”,它们是不属于任何集群的点。对于这些点,我想确定从它到最近集群的距离,以获得类似于该点异常程度的指标。这可能吗?或者这种指标有什么替代品吗?

【问题讨论】:

你想如何测量到集群的距离?有很多选择:单链接表示到集群的距离是到其最近成员的距离。完整的链接表示它是到最远成员的距离。有平均的联系,沃德的联系……你要干什么? 我的第一个直觉是single linkage 听起来是一个很好的指标,这也是我的想法。但很高兴知道有不同的指标,谢谢。 如果我理解正确,您想确定噪声点到集群最近点的距离(因为您使用单链接)对吗?如果是这样,您可以通过sklearn.metrics.pairwise.euclidean_distances 计算噪声点和聚类点之间的欧几里得距离。欧几里得距离应该很好用,因为它也是 DBSCAN 中最常用的距离度量。 【参考方案1】:

答案将取决于您选择的联动策略。我举个单联的例子。

首先,您可以构建数据的距离矩阵。

from sklearn.metrics.pairwise import pairwise_distances
dist_matrix = pairwise_distances(X)

然后,您将提取最近的集群:

for point in unclustered_points:
    distances = []
    for cluster in clusters:
        distance = dist_matrix[point, cluster].min()  # Single linkage
        distances.append(distance)
    print("The cluster for  is ".format(point, cluster)

编辑:这有效,但正如 Anony-Mousse 所指出的,它是 O(n^2)。考虑核心点是一个更好的主意,因为它会减少你的工作量。此外,它有点类似于质心联动。

【讨论】:

这很慢,因为它计算了许多不需要的距离。此外,它使用 O(n²) 内存,不适用于更大的数据集。【参考方案2】:

为了更接近 DBSCAN 的直觉,您可能应该只考虑 core 点。

将核心点放入最近邻搜索器。然后搜索所有噪声点,使用最近点的聚类标签。

【讨论】:

以上是关于sklearn:从点到最近的集群获取距离的主要内容,如果未能解决你的问题,请参考以下文章

Sklearn:到每个集群的质心的平均距离

如何计算给定点到最近道路的距离?

如何获取从固定点到特定距离的坐标邻居

如何从 sklearn gridsearchcv 获取敏感性和特异性(真阳性率和真阴性率)?

SKLearn:从决策边界获取每个点的距离?

获取点和影片剪辑之间的距离