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

时间:2013-09-20 04:59:25

标签: algorithm machine-learning cluster-analysis

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

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

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

考虑到这些,请向我推荐一些适合我案例的聚类方法,其中

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

7 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

您可以尝试multidimensional scaling(MDS)。使用MDS将类似距离的数据转换为几何图片后,可以应用常用的聚类方法(如k-means)进行聚类。有关详情,请参阅herehere

答案 4 :(得分:1)

您可以尝试使用hierarchical clustering。它有两种类型:

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

答案 5 :(得分:1)

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

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

前面提到的论文中的第7.2节讨论了一个完整矩阵的聚类,其中恢复基础数量的聚类是手头任务的重要部分。

答案 6 :(得分:0)

使用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)