我有一组对象{obj1, obj2, obj3, ..., objn}
。我已经计算了所有可能对的成对距离。距离存储在n*n
矩阵M
中,Mij
是obji
和objj
之间的距离。那么很自然地看到M
是一个对称矩阵。
现在我希望对这些对象执行无监督的聚类。经过一些搜索,我发现Spectral Clustering可能是一个很好的候选人,因为它处理这种成对距离的情况。
然而,在仔细阅读其描述后,我发现它不适合我的情况,因为它需要群集的数量作为输入。在群集之前,我不知道群集的数量。在执行聚类时,必须通过算法弄清楚它,如DBSCAN。
考虑到这些,请向我推荐一些适合我案例的聚类方法,其中
答案 0 :(得分:5)
有许多可能的聚类方法,并且它们都不能被认为是“最好的”,一切都取决于数据,一如既往:
答案 1 :(得分:2)
需要群集数量先验的群集方法比尝试估算群集数量的方法更为常见。您可以在Cross Validated获得更好的答案。然而,与此同时,最近几个解决问题的方法是:
答案 2 :(得分:2)
如果你喜欢概率聚类,那么迄今为止没有人提出的另一种方法是贝叶斯非参数(Dirichlet过程先验是最简单的情况)。如果您的数据是连续的,您可以将多项似然数用于计数类型数据,或多变量高斯可能性。
答案 3 :(得分:2)
您可以尝试multidimensional scaling(MDS)。使用MDS将类似距离的数据转换为几何图片后,可以应用常用的聚类方法(如k-means)进行聚类。有关详情,请参阅here和here。
答案 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)