10

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

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

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

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

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

7 回答 7

7

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

于 2013-09-20T10:15:18.963 回答
3

您可以尝试多维缩放(MDS)。使用 MDS 将类距离数据转换成几何图形后,可以应用常用的聚类方法(如 k-means)进行聚类。有关更多信息,请参见此处此处

于 2013-09-22T15:18:24.910 回答
2

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

于 2013-09-20T05:43:18.713 回答
2

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

于 2013-09-20T12:29:41.203 回答
1

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

  • 凝聚或“自下而上”的方法:每个观察都从其自己的集群开始,当一个集群向上移动时,成对的集群被合并。
  • 分裂或“自上而下”的方法:所有观察都从一个集群开始,并且随着一个层次向下移动,递归地执行拆分。
于 2013-09-20T05:35:34.317 回答
1

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

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

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

于 2013-10-22T09:30:31.517 回答
1

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

如何做到这一点的想法如下(对于需要创建成对距离矩阵的情况):

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)
于 2018-01-17T19:16:25.213 回答