一尘不染

集群数量未知的无监督集群

algorithm

我在3维中有大量的向量。我需要基于欧几里得距离对它们进行聚类,以使任何特定聚类中的所有向量彼此之间的欧几里得距离小于阈值“ T”。

我不知道有多少集群。最后,可能存在不属于任何群集的单个矢量,因为对于空间中的任何矢量,其欧式距离都不小于“ T”。

在此应使用哪些现有算法/方法?


阅读 214

收藏
2020-07-28

共1个答案

一尘不染

您可以使用分层聚类。这是一种相当基本的方法,因此有许多可用的实现。例如,它包含在Python的scipy中

例如,请参见以下脚本:

import matplotlib.pyplot as plt
import numpy
import scipy.cluster.hierarchy as hcluster

# generate 3 clusters of each around 100 points and one orphan point
N=100
data = numpy.random.randn(3*N,2)
data[:N] += 5
data[-N:] += 10
data[-1:] -= 20

# clustering
thresh = 1.5
clusters = hcluster.fclusterdata(data, thresh, criterion="distance")

# plotting
plt.scatter(*numpy.transpose(data), c=clusters)
plt.axis("equal")
title = "threshold: %f, number of clusters: %d" % (thresh, len(set(clusters)))
plt.title(title)
plt.show()

产生的结果类似于下图。 集群

作为参数给出的阈值是一个距离值,在此基础上决定是否将点/群集合并到另一个群集中。也可以指定使用的距离度量。

请注意,有多种方法可用于计算群集内/群集间相似度,例如最近点之间的距离,最远点之间的距离,到群集中心的距离等等。scipys分层聚类模块(单个/完整/平均…链接)也支持其中一些方法。根据您的帖子,我认为您想使用完整的链接

请注意,如果小型(单点)群集不满足其他群集的相似性标准(即距离阈值),则也可以使用该方法。


还有其他一些性能会更好的算法,这些算法在具有大量数据点的情况下将变得有意义。正如其他答案/评论所建议的那样,您可能还想看看DBSCAN算法:


有关这些和其他群集算法的概述,请查看以下演示页面(Python的scikit-learn库的内容):

从该位置复制的图像:

http://scikit-
learn.org/stable/auto_examples/cluster/plot_cluster_comparison.html

如您所见,每种算法都会对需要考虑的簇的数量和形状做出一些假设。是算法强加的隐式假设,还是参数化指定的显式假设。

2020-07-28