【发布时间】:2011-04-13 02:46:15
【问题描述】:
我有一个(对称)矩阵M,它表示每对节点之间的距离。例如,
有没有什么方法可以从M中提取集群(如果需要,集群的数量可以固定),使得每个集群中包含的节点之间的距离很小。在示例中,集群将是 (A, B, C, D)、(E, F, G, H) 和 (I, J, K, L)。
非常感谢:)
【问题讨论】:
标签: algorithm matrix cluster-analysis distance
我有一个(对称)矩阵M,它表示每对节点之间的距离。例如,
有没有什么方法可以从M中提取集群(如果需要,集群的数量可以固定),使得每个集群中包含的节点之间的距离很小。在示例中,集群将是 (A, B, C, D)、(E, F, G, H) 和 (I, J, K, L)。
非常感谢:)
【问题讨论】:
标签: algorithm matrix cluster-analysis distance
Hierarchical clustering 直接使用距离矩阵而不是实际观察值。如果您知道集群的数量,您将已经知道您的停止标准(当有 k 个集群时停止)。这里的主要技巧是选择一个合适的linkage method。此外,this paper(pdf) 对各种聚类方法进行了出色的概述。
【讨论】:
另一种可能的方法是使用通常称为 K-Medoids 的Partitioning Around Medoids。如果您查看 R-clustering 包,您会看到 pam 函数,它接收距离矩阵作为输入数据。
【讨论】:
好吧,可以对给定的相似度矩阵执行 K-means 聚类,首先您需要将矩阵居中,然后取矩阵的特征值。最后也是最重要的一步是将前两组特征向量乘以特征值的对角线的平方根以获得向量,然后继续使用 K-means 。下面的代码显示了如何做到这一点。您可以更改相似度矩阵。 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)
【讨论】: