如果您进行了层次聚类,它会输出一系列更具包容性的渐进式聚类。如果您想使用层次聚类来确定哪些用户相似,您只需查看返回的树状图即可查看哪些用户在最低级别加入。共同的距离使这个想法具体化。它是包含两个对象的集群合并为一个集群时的组间距离。要看到这一点,这里有一个简单的演示R
:
set.seed(9) # this makes the example exactly reproducible
x1 = runif(10) # these data are simple uniform on 2 dimensions
x2 = runif(10) # (i.e., they actually have no cluster structure)
以下是这些数据的样子:

这些是所有点之间的欧几里得距离:
round(dist(cbind(x1, x2)), digits=3)
1 2 3 4 5 6 7 8 9
2 0.226
3 0.766 0.894
4 0.184 0.350 0.582
5 0.436 0.641 0.457 0.298
6 0.393 0.504 0.390 0.216 0.310
7 0.331 0.538 0.515 0.202 0.105 0.275
8 0.872 1.028 0.187 0.693 0.490 0.531 0.575
9 0.508 0.733 0.699 0.457 0.262 0.553 0.281 0.687
10 0.856 1.082 0.877 0.799 0.548 0.858 0.608 0.790 0.350
在这里我运行一个层次聚类:
HC = hclust(dist(cbind(x1, x2)), method="complete")
这是层次聚类的样子:

要获得两点之间的共同距离,请沿着这些点向上的线直到两条路径相遇。两条路径汇合的水平线的 y 值是这两个点之间的共同距离。这是包含每个点但不包含其他点的两个最大集群之间的距离。当每个簇仅包含 1 个点时,这在底部最容易看到。例如,最小的共生距离在5
& 7
( ) 之间。像这样的情况,你只连接两个初始点,共相距离必然等于你用来形成层次聚类的原始距离,所以它不是很有趣。也许一个更有趣的例子是dc=.1053
& 5
. 虽然这两个点之间的原始距离是它们的欧几里得距离 ( ),但它们的共同距离是这些点所属的两个集群之间的距离,就在集群合并到层次结构中更大的集群之前包括他们两者。对于点& ,这些簇分别是& 。这些集群之间的共同距离是完整的链接距离(较低级别集群中任意两点之间的最大距离),因为这是我用来形成集群的方法(即 )。 dE=.4573
5
{3, 8}
{5, 7, 9, 10}
dc(3,5)=.877=dE(3,10)=.877
这些是基于层次聚类输出的所有点之间的共同距离:
round(cophenetic(HC), digits=3)
1 2 3 4 5 6 7 8 9
2 0.350
3 1.082 1.082
4 0.184 0.350 1.082
5 1.082 1.082 0.877 1.082
6 0.504 0.504 1.082 0.504 1.082
7 1.082 1.082 0.877 1.082 0.105 1.082
8 1.082 1.082 0.187 1.082 0.877 1.082 0.877
9 1.082 1.082 0.877 1.082 0.281 1.082 0.281 0.877
10 1.082 1.082 0.877 1.082 0.608 1.082 0.608 0.877 0.608
我们可以通过关联它们来检查这两种距离之间的关系,并为每对独特的点绘制两种距离的散点图:
cor(cophenetic(HC), dist(cbind(x1, x2)))
[1] 0.5726733

我们看到存在相当强的相关性 ( ),但我们也可以看到其他情况。这些点仅存在于绘图的上/左三角半部分,因为共距距离不能小于原始距离。Cophenetic 距离只出现在离散值中,并且有很多联系。在左侧散点图的顶部,我们还注意到有些点的欧几里得距离非常小,但它们的共生距离非常大(例如,& ,其中 &)。 r=.574
7
dE=.202dc=1.082
请注意,您获得的共同距离将取决于层次聚类(此处complete
)和基础距离度量(此处Euclidean
)中使用的方法。如果您只想知道哪些用户最相似,这可能对您有所帮助,也可能无济于事。首先(至关重要)确定哪个距离度量(欧几里得、Jaccard 等)最能捕捉您想要测量的相似感,然后确定聚类方法是否合适。是否应该使用聚类的共生距离取决于您是否认为用户的聚类成员关系在某种本体论意义上应该优先。