我有一个(对称)矩阵M
,表示每对节点之间的距离。例如,
A B C D E F G H I J K L A 0 20 20 20 40 60 60 60 100 120 120 120 B 20 0 20 20 60 80 80 80 120 140 140 140 C 20 20 0 20 60 80 80 80 120 140 140 140 D 20 20 20 0 60 80 80 80 120 140 140 140 E 40 60 60 60 0 20 20 20 60 80 80 80 F 60 80 80 80 20 0 20 20 40 60 60 60 G 60 80 80 80 20 20 0 20 60 80 80 80 H 60 80 80 80 20 20 20 0 60 80 80 80 I 100 120 120 120 60 40 60 60 0 20 20 20 J 120 140 140 140 80 60 80 80 20 0 20 20 K 120 140 140 140 80 60 80 80 20 20 0 20 L 120 140 140 140 80 60 80 80 20 20 20 0
是否有任何方法可以从M
中提取集群(如果需要,可以修复集群的数量),这样每个集群都包含它们之间距离较小的节点。在示例中,群集将为(A, B, C, D)
,(E, F, G, H)
和(I, J, K, L)
。
非常感谢:)
答案 0 :(得分:7)
Hierarchical clustering直接与距离矩阵一起工作,而不是实际观察。如果你知道了簇的数量,你就会知道你的停止标准(当有k个簇时停止)。这里的主要技巧是选择合适的linkage method。此外,this paper(pdf)可以很好地概述各种聚类方法。
答案 1 :(得分:2)
另一种可能的方法是使用通常称为K-Medoids的Partitioning Around Medoids。如果你看一下R-clustering包,你会看到 pam 函数,它接收距离矩阵作为输入数据。
答案 2 :(得分:0)
嗯,可以在给定的相似度矩阵上执行K均值聚类,首先需要使矩阵居中,然后取矩阵的特征值。最后和最重要的步骤是将前两组特征向量乘以特征值对角线的平方根以得到向量,然后用K均值继续前进。代码下方显示了如何执行此操作。您可以更改相似度矩阵。 fpdist是相似度矩阵。
mds.tau <- function(H)
{
n <- nrow(H)
P <- diag(n) - 1/n
return(-0.5 * P %*% H %*% P)
}
B<-mds.tau(fpdist)
eig <- eigen(B, symmetric = TRUE)
v <- eig$values[1:2]
#convert negative values to 0.
v[v < 0] <- 0
X <- eig$vectors[, 1:2] %*% diag(sqrt(v))
library(vegan)
km <- kmeans(X,centers= 5, iter.max=1000, nstart=10000) .
#embedding using MDS
cmd<-cmdscale(fpdist)