繁体   English   中英

聚类给定成对距离与未知簇号?

[英]Clustering given pairwise distances with unknown cluster number?

我有一组对象{obj1, obj2, obj3, ..., objn} 我已经计算了所有可能对的成对距离。 距离存储在n*n矩阵M ,其中Mijobjiobjj之间的距离。 然后很自然地看到M是对称矩阵。

现在我希望对这些对象执行无监督的聚类。 在一些搜索之后,我发现光谱聚类可能是一个很好的候选者,因为它处理这种成对距离的情况。

但是,在仔细阅读其描述之后,我发现它在我的情况下不合适,因为它需要簇的数量作为输入 在群集之前,我不知道群集的数量。 在执行聚类时,必须通过算法计算出它,如DBSCAN。

考虑到这些,请建议一些适合我的情况的聚类方法 ,在哪里

  1. 成对距离都可用。
  2. 群集数量未知。

有许多可能的聚类方法,并且它们都不能被认为是“最好的”,一切都取决于数据,一如既往:

需要先验集群数量的集群方法比尝试估计集群数量的集群方法更常见。 您可以在Cross Validated中获得更好的答案。 然而,与此同时,最近几个解决问题的方法是:

  • 通过Tibshirani,Walther和Hastie 的差距统计估计数据集中的聚类数量 ,它将聚类内分散的变化与聚类数量与适当参考零分布的预期变化进行比较。 这种方法有R实现
  • Tibshirani和Walther 通过预测强度进行聚类验证 ,将聚类视为监督分类问题,我们还必须估计'真实'类标签。得到的'预测强度'度量评估可以从数据中预测多少组,以及如何。“

如果你喜欢概率聚类,那么迄今为止没有人提出的另一种方法是贝叶斯非参数(Dirichlet过程先验是最简单的情况)。 如果您的数据是连续的,您可以将多项式似然用于计数型数据,或多变量高斯可能性。

您可以尝试多维缩放 (MDS)。 使用MDS将类似距离的数据转换为几何图片后,可以应用常用的聚类方法(如k-means)进行聚类。 点击此处此处了解更多信息。

您可以尝试使用层次聚类 它有两种类型:

  • 凝聚或“自下而上”方法:每个观察在其自己的集群中开始,并且当一个集群向上移动时,将合并成对的集群。
  • 分裂或“自上而下”方法:所有观察在一个群集中开始,并且当向下移动层次结构时,递归地执行分割。

您是否考虑过相关聚类
如果您仔细阅读该论文中的第2.1节,您将看到对恢复的聚类数量的概率解释。

M矩阵所需的唯一修改是设置一个阈值,确定哪个距离被认为是“相同”,哪个距离太大,应该被视为“不相同”。

上述论文中的第7.2节涉及完整矩阵的聚类,其中基础数量的簇的恢复是手头任务的重要部分。

在sklearn聚类算法中使用metric='precomputed'参数很容易。 您使用成对距离矩阵而不是原始要素拟合模型。

如何执行此操作的想法如下(对于您还需要创建成对距离矩阵的情况):

def my_metric(x, y):
   # implement your distance measure between x and y

def create_pairwise_dist(X_data):
   # create a matrix of pairwised distances between all elements in your X_data
   # for example with sklearn.metrics.pairwise.pairwise_distances
   # or scipy.spatial.distance.pdist
   # or your own code

X_data = <prepare your data matrix of features>
X_dist = create_pairwise_dist(X_data)

# then you can use DBSCAN

dbscan = DBSCAN(eps=1.3, metric='precomputed')
dbscan.fit(X_dist)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM