【问题标题】:Clustering given pairwise distances with unknown cluster number?聚类给定具有未知聚类数的成对距离?
【发布时间】:2013-09-25 09:19:57
【问题描述】:

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

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

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

考虑到这些,请给我一些适合我情况的聚类方法,其中

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

【问题讨论】:

  • DBSCAN 有什么问题?它确实不需要需要知道集群的数量...
  • @Anony-Mousse 我不确定它是否适合“相对距离”
  • 您从未提及“相对距离”。那到底是什么?距离总是相对值......事实上,DBSCAN 只需要一个二元“近”决策,请参阅广义 DBSCAN。
  • @Anony-Mousse 对不起!错字。应该是“成对距离”
  • 好吧,DBSCAN 显然可以处理这个问题。 DBSCAN 是基于距离的,而不是基于坐标的(k-means 需要坐标来计算平均值 - 但 DBSCAN 没有这个限制)。所以你真的应该试试 DBSCAN

标签: algorithm machine-learning cluster-analysis


【解决方案1】:

在 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)

【讨论】:

    【解决方案2】:

    你考虑过Correlation Clustering吗?
    如果您仔细阅读该论文中的第 2.1 节,您会看到对恢复的集群数量的概率解释。

    您需要对M 矩阵进行的唯一修改是设置一个阈值,以决定哪些距离被视为“相同”,哪些距离太大而应被视为“不一样”。

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

    【讨论】:

      【解决方案3】:

      您可以尝试multidimensional scaling (MDS)。使用 MDS 将类距离数据转换为几何图形后,可以应用常用的聚类方法(如 k-means)进行聚类。请参阅herehere 了解更多信息。

      【讨论】:

        【解决方案4】:

        可能的聚类方法有很多,但没有一种可以被认为是“最好的”,一切都取决于数据,一如既往:

        【讨论】:

        • 请注意,它是 DBSCAN,而不是 DBScan。它是一个缩写,例如 N 代表噪声。它并不是真正“扫描”数据库,但它最适合使用索引结构来加速搜索。 +1 列出最受欢迎的。
        【解决方案5】:

        如果您喜欢概率聚类,那么迄今为止没人建议的另一种方法是贝叶斯非参数(Dirichlet 过程先验是最简单的情况)。您可以对计数类型的数据使用多项似然,如果您的数据是连续的,则可以使用多元高斯似然。

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

            需要聚类数量的聚类方法先验比那些试图估计聚类数量的方法更常见。您可能会在Cross Validated 获得更好的答案。然而,与此同时,最近解决该问题的几种方法是:

            【讨论】:

            • 感谢您的回答!也许我没有把问题说得很清楚,实际上“成对距离”对我来说更重要。也就是说,我们可以先忽略 unknown-class-number 问题。 “成对距离”上还有其他 cmets 吗?
            • 成对距离是衡量项目之间差异的典型指标。我使用的每个聚类算法都需要对每对项目之间的差异进行某种度量作为输入,但在某些情况下还有其他合理的差异度量,例如每对之间距离的平方。
            猜你喜欢
            • 2021-01-24
            • 1970-01-01
            • 2014-07-28
            • 2019-12-27
            • 2012-07-09
            • 2014-02-26
            • 2016-11-18
            • 2016-08-21
            • 2016-01-10
            相关资源
            最近更新 更多