用距离矩阵聚类


52

我有一个(对称)矩阵M,表示每对节点之间的距离。例如,

    ABCDEFGHIJKL
0 20 20 20 40 60 60 60 100 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
我100120120120 60 40 60 60 0 20 20 20
J 120140140140 80 60 80 80 20 0 20 20
K 120 140 140 140 80 60 80 80 20 20 0 20
L 120140140140 80 60 80 80 20 20 20 0

是否有任何方法可以从中提取群集M(如果需要,可以固定群集的数量),以使每个群集包含的节点之间的距离很小。在该示例中,聚类将是(A, B, C, D)(E, F, G, H)(I, J, K, L)

我已经尝试过UPGMA和k-means,但是生成的群集非常糟糕。

距离是随机步行者从节点A到节点B!= A)再返回节点的平均步长A。保证这M^1/2是一个指标。运行k-means,我不使用质心。我将节点n簇之间的距离定义c为中n与所有节点之间的平均距离c

非常感谢 :)


1
你应该考虑补充说,您已经尝试UPGMA(和其他人,你可能已经尝试):)信息
比约恩博动

1
我有个问题。您为什么说k均值表现不佳?我已经将您的矩阵传递给k均值,并且它完成了完美的聚类。您是否没有将k(簇数)的值传递给k-means?

3
@ user12023我认为您误解了这个问题。矩阵不是一系列点,而是它们之间的成对距离。当您仅通过点之间的距离(而不是它们的实际坐标)时(至少没有明显的方式),就无法计算点集合的质心。
笨拙的乔·皮特2015年

7
k均值不支持距离矩阵。它从不使用点对点距离。因此,我只能假设它必须将您的矩阵重新解释为向量,并在这些向量上运行...对于您尝试的其他算法,可能发生了相同的情况:它们期望原始数据,并且您传递了距离矩阵。
Anony-Mousse 2015年

Answers:


38

有很多选择。

k-medoids聚类

首先,您可以尝试围绕类固醇(pam)进行分区,而不是使用k-means聚类。这一功能更强大,并且可以提供更好的结果。Van der Laan重新设计了算法。如果您打算自己实现它,那么他的文章值得一读。

对于大型数据集,有一种特定的k-medoids聚类算法。该算法在R中称为Clara,并在“ 在数据查找组:聚类分析简介”的第3章中进行了描述 由Kaufman,L和Rousseeuw,PJ(1990)。

层次聚类

除了UPGMA,您可以尝试其他分层聚类选项。首先,当您使用分层群集时,请确保正确定义分区方法。这种划分方法实质上是如何计算观测值和聚类之间的距离。我主要使用Ward的方法或完全链接,但是其他选项可能是您的选择。

不知道您是否尝试过,但是在系统发育应用中,单链接方法或邻居连接通常比UPGMA更可取。如果您还没有尝试过,也可以尝试一下,因为它通常会产生非常好的效果。


在R中,您可以查看软件包集群。所有描述的算法都在此实现。请参见?pam,?clara,?hclust,...。还要检查算法在kmeans中的不同实现。有时选择另一种算法可以大大改善聚类。


编辑:只是想一想:如果您使用图和节点之类的东西,那么您也应该看看markov聚类算法。该程序例如用于基于爆炸相似性的分组序列中,并且执行得非常好。它可以为您完成聚类,或者为您提供有关如何解决您关注的研究问题的一些想法。实际上,对此一无所知,我想他的结果绝对值得一看。如果我可以这么说,我仍然认为Stijn van Dongen的这种方法是我见过的最好的聚类结果之一。

http://www.micans.org/mcl/


22

一种在距离矩阵上突出显示聚类的方法是多维缩放。在2D空间中投影个人(这里称为节点)时,它可以提供与PCA相似的解决方案。这是不受监督的,因此您将无法预先指定聚类的数量,但是我认为这可能有助于快速总结给定的距离或相似度矩阵。

这是您将获得的数据:

tmp <- matrix(c(0,20,20,20,40,60,60,60,100,120,120,120,
                20,0,20,20,60,80,80,80,120,140,140,140,
                20,20,0,20,60,80,80,80,120,140,140,140,
                20,20,20,0,60,80,80,80,120,140,140,140,
                40,60,60,60,0,20,20,20,60,80,80,80,
                60,80,80,80,20,0,20,20,40,60,60,60,
                60,80,80,80,20,20,0,20,60,80,80,80,
                60,80,80,80,20,20,20,0,60,80,80,80,
                100,120,120,120,60,40,60,60,0,20,20,20,
                120,140,140,140,80,60,80,80,20,0,20,20,
                120,140,140,140,80,60,80,80,20,20,0,20,
                120,140,140,140,80,60,80,80,20,20,20,0),
              nr=12, dimnames=list(LETTERS[1:12], LETTERS[1:12]))
d <- as.dist(tmp)
mds.coor <- cmdscale(d)
plot(mds.coor[,1], mds.coor[,2], type="n", xlab="", ylab="")
text(jitter(mds.coor[,1]), jitter(mds.coor[,2]),
     rownames(mds.coor), cex=0.8)
abline(h=0,v=0,col="gray75")

mds

我在x和y坐标上添加了一个小的抖动,以区分不同的情况。如果您更喜欢处理差异,请替换tmp1-tmp,但这基本上产生了相同的图像。但是,这是具有单个聚集条件的分层聚类解决方案:

plot(hclust(dist(1-tmp), method="single"))

HC

您可以根据树状图或更鲁棒的方法进一步优化聚类的选择,例如,请参见以下相关问题:实际中使用了哪些用于聚集层次聚类的停止标准?


2

谱聚类[1]需要一个亲和矩阵,聚类由定义ķ

L=D1/2AD1/2

AD一种一世Ĵ=1个-d一世Ĵ/最高d

{ð一世一世=Ĵ一种一世Ĵð一世Ĵ=0

X大号ķX

ÿ一世Ĵ=X一世ĴĴX一世Ĵ21个/2

ÿ[Rķ

在这里查看我的答案以查看示例:https : //stackoverflow.com/a/37933688/2874779


[1] Ng,AY,Jordan,MI,&Weiss,Y.(2002)。关于频谱聚类:分析和算法。神经信息处理系统的进展,第2卷,第849-856页。第2页


2

您正在做的是尝试将彼此靠近的图或网络的节点聚集在一起。有专门针对此问题的整个研究领域,有时也称为网络中的社区检测。从这种角度看待您的问题可能可以澄清问题。

您会发现许多专用于此问题的算法,实际上其中一些算法是基于您所拥有的相同思想,即使用随机游走来测量节点之间的距离。

该问题通常被表述为模块化优化 [1],其中群集的模块化衡量了群集在密集连接的群集(即节点彼此靠近的群集)中分隔网络的程度。

实际上,您可以证明模块化程度等于随机步行者在一步之后停留在同一集群中的概率要比最初减去两个独立随机步行者的概率相同[2]。

如果允许随机步行者执行更多操作,则您正在寻找网络的粗略群集。因此,随机游走的步数起分辨率参数的作用,该分辨率参数可恢复群集的层次结构。在这种情况下,表示t步之后随机游走者停留在其初始簇中的趋势的量称为时间t [2] 处的分区马尔可夫稳定性,它等于t = 1时的模数。

因此,您可以通过找到在给定时间t处优化稳定性的图的聚类来解决您的问题,其中t是分辨率参数(较大的t将为您提供较大的聚类)。优化稳定性(或带有分辨率参数的模块化)的最常用方法之一是Louvain算法 [3]。您可以在这里找到实现:https : //github.com/michaelschaub/generalizedLouvain

[1] Newman,MEJ和Girvan,M。在网络中查找和评估社区结构。物理 E 69,026113(2004)。

[2] Delvenne,J.-C.,Yaliraki,SN和Barahona,M。跨时间尺度的图社区的稳定性。程序 Natl。学院 科学 107,12755–12760(2010)。

[3] Blondl,VD,Guillaume,J.-L.,Lambiotte,R。和Lefebvre,E。大型网络中社区的快速发展。统计 机甲 理论经验 2008,P10008(2008)。


1

嗯,可以在给定的相似性矩阵上执行K-均值聚类,首先需要将矩阵居中,然后获取矩阵的特征值。最后也是最重要的一步是将前两个特征向量集与特征值对角线的平方根相乘以获得向量,然后继续进行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)

0

在尝试在矩阵上运行聚类之前,您可以尝试执行一种因子分析技术,并仅保留最重要的变量来计算距离矩阵。您可以做的另一件事是尝试使用在这种情况下效果更好的模糊方法(至少以我的经验),首先尝试Cmeans,Fuzzy K-medoids和Specially GKCmeans。


0

共同集群是我认为的答案之一。但是我在这里不是专家。共弦不是新生的方法,因此您可以在R中找到一些算法,Wiki很好地显示了这些概念。另一种没有杀人的方法是图分区(但是我看到图不会是稀疏的,如果您的矩阵将被值=最大距离=节点之间没有相似性所支配,则图分区将很有用)。


0

查看AFFINITY PROPAGATION,该技术将相似度矩阵作为输入,并生成最佳数目的群集以及每个群集的代表性示例。


2
您能否对此进行扩展并解释这种情况下该方法的帮助?
安迪


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.