[英]Clustering given pairwise distances with unknown cluster number?
我有一组对象{obj1, obj2, obj3, ..., objn}
。 我已经计算了所有可能对的成对距离。 距离存储在n*n
矩阵M
,其中Mij
是obji
和objj
之间的距离。 然后很自然地看到M
是对称矩阵。
现在我希望对这些对象执行无监督的聚类。 在一些搜索之后,我发现光谱聚类可能是一个很好的候选者,因为它处理这种成对距离的情况。
但是,在仔细阅读其描述之后,我发现它在我的情况下不合适,因为它需要簇的数量作为输入 。 在群集之前,我不知道群集的数量。 在执行聚类时,必须通过算法计算出它,如DBSCAN。
考虑到这些,请建议一些适合我的情况的聚类方法 ,在哪里
需要先验集群数量的集群方法比尝试估计集群数量的集群方法更常见。 您可以在Cross Validated中获得更好的答案。 然而,与此同时,最近几个解决问题的方法是:
如果你喜欢概率聚类,那么迄今为止没有人提出的另一种方法是贝叶斯非参数(Dirichlet过程先验是最简单的情况)。 如果您的数据是连续的,您可以将多项式似然用于计数型数据,或多变量高斯可能性。
您可以尝试使用层次聚类 。 它有两种类型:
您是否考虑过相关聚类 ?
如果您仔细阅读该论文中的第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.