我在3个维的大组矢量。 我需要基于欧几里得距离,使得在任何特定群集中的所有矢量具有比之间的阈值“T”彼此更小的欧几里德距离进行聚类这些。
我不知道集群存在多少。 在端部,有可能是不属于任何簇的一部分,因为它的欧几里德距离不小于“T”与任何所述空间中的矢量的单个矢量现有。
哪些现有的算法/方法应该用在这里?
我在3个维的大组矢量。 我需要基于欧几里得距离,使得在任何特定群集中的所有矢量具有比之间的阈值“T”彼此更小的欧几里德距离进行聚类这些。
我不知道集群存在多少。 在端部,有可能是不属于任何簇的一部分,因为它的欧几里德距离不小于“T”与任何所述空间中的矢量的单个矢量现有。
哪些现有的算法/方法应该用在这里?
您可以使用分层聚类 。 这是一个相当基本的方法,所以有很多可用的实现。 它例如包括在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学习库):
图片来自那个地方复制:
正如你所看到的,每个算法对需要被考虑到集群的数量和形状的一些假设。 由算法或参数指定明确的假设强加它隐含假设。
建议采用分层聚类通过moooeeeep答案。 我想阐述一下如何选择聚类treshold。
一种方法是计算基于不同的阈值T1,T2,T3,...聚类,然后计算度量的聚类的“质量”。 前提是,与最佳聚类数聚类的质量将有质量度量的最大值。
我已经在过去使用的良好质量度量的一个例子是Calinski-Harabasz。 简单地说:你计算平均簇间距离和内非簇距离他们分开。 最优聚类分配将具有相互最多,集群是“紧密的”分离集群。
顺便说一句,你不必使用分层聚类。 您也可以使用类似k均值,预先计算它对于每个k,然后挑选具有最高Calinski-Harabasz得分k个 。
让我知道如果你需要更多的参考,我会冲刷我的硬盘上的一些文件。
退房的DBSCAN算法。 它簇基于矢量的局部密度,即,它们必须不大于分开一段距离ε以上,并且可以自动地确定的簇的数目。 它还认为离群值,与ε-neighbors的非充分数目即点,不会是群集的一部分。 维基百科页面链接到了几个实现。
Use OPTICS, which works well with large data sets.
OPTICS: Ordering Points To Identify the Clustering Structure Closely related to DBSCAN, finds core sample of high density and expands clusters from them 1. Unlike DBSCAN, keeps cluster hierarchy for a variable neighborhood radius. Better suited for usage on large datasets than the current sklearn implementation of DBSCAN
from sklearn.cluster import OPTICS
db = DBSCAN(eps=3, min_samples=30).fit(X)
Fine tune eps, min_samples as per your requirement.