我试图使用clusplot来可视化kmeans聚类。 Reinventthewheel.csv是对称相似性矩阵(1087行),其值为[0,1]
。出于某种原因,clusplot将仅为n
的某些值生成n
个集群的图。对于n
的其他值,它会返回以下错误:
library(cluster)
simmy = read.csv("reinventthewheel.csv", header=TRUE, row.names=1)
disty = dist(1-simmy)
kay19 <- kmeans(disty,19)$cluster
par(mfrow=c(3,2))
clusplot(disty, diss=TRUE, kay19, color=FALSE, shade=FALSE, lines=0, col.p=kay19, main="KMEANS", sub="19 assortments")
#(successfully plotted for n=19)
kay20 <- kmeans(disty,20)$cluster
clusplot(disty, diss=TRUE, kay20, color=FALSE, shade=FALSE, lines=0, col.p=kay20, main="KMEANS", sub="20 assortments")
Error in seq.default(-sqrt(yl2), sqrt(yl2), length = n.half) :
'from' cannot be NA, NaN or infinite
#(failed to plot for n=20)
kay21<-kmeans(disty,21)$cluster
clusplot(disty, diss=TRUE, kay21, color=FALSE, shade=FALSE, lines=0, col.p=kay21, main="KMEANS", sub="21 assortments")
Error in seq.default(-sqrt(yl2), sqrt(yl2), length = n.half) :
'from' cannot be NA, NaN or infinite
#(failed to plot for n=21)
kay22<-kmeans(disty,22)$cluster
clusplot(disty, diss=TRUE, kay22, color=FALSE, shade=FALSE, lines=0, col.p=kay22, main="KMEANS", sub="22 assortments")
#(successfully plotted for n=22)
我想也许n=20
和n=21
正在生成空集群,但事实并非如此。每个群集至少有一个点。
在为任何cutree(hclust)
绘制相同矩阵的层次结构集群(使用n
)时,我不会遇到这些错误。有关可能导致此错误的原因的任何想法?提前谢谢。
答案 0 :(得分:2)
这里有几件事情。
首先,您应该知道kmeans(dist,n)
使用一种算法,该算法随机定义n个群集质心 ,然后移动它们,直到满足最小化标准。这通常会导致局部最小值,这反过来意味着如果您重复运行kmeans(dist,n)
,使用相同的dist和n ,则每次都可能会获得不同的群集。对于大量群集或差异较小的群集而言,这尤其成问题,这两种情况都适用于您的情况。
您可以在运行set.seed(x)
之前使用kmeans(...)
重复此过程,但这仍然不能保证&#34;最佳&#34; n个簇的排列。因此,当我使用您的数据运行代码clusplot(...)
适用于19,20和22个群集,并且21个群集失败。这是因为我得到不同的群集而不是你。
其次,错误显然是由于在某些情况下计算每个群集的省略号的算法失败。默认值clusplot(...,span=T)
使用最小体积椭圆体方法,该方法应将每个聚类包含在包含聚类中所有点的最小椭圆中。显然,对于某些点的排列,该算法失败。 span=F
基于群集中的点遵循二元正态分布并将椭圆基于每个群集中的点的协方差矩阵的假设生成省略号。当我使用span=F
运行代码时,我没有错误。
后一种方法基本上围绕每个星团的质心绘制信心带(我相信这些是95%的置信区间,但我不确定)。虽然这会产生更大的椭圆,并且图形不如最小体积方法那么漂亮,但IMO这是表示数据的更好方法,因为它准确地描述了集群中存在大量重叠的事实。 :许多点可以很容易地属于多个集群。当我使用置信带方法时,我得到下面的图。最后的代码几乎与你的代码完全相同,但我将其包含在内,以表明如果运行该代码,您将获得相同的结果。
library(cluster)
simmy = read.csv("reinventthewheel.csv", header=TRUE, row.names=1)
disty = dist(1-simmy)
set.seed(1)
kay19 <- kmeans(disty,19)$cluster
kay20 <- kmeans(disty,20)$cluster
kay21<-kmeans(disty,21)$cluster
kay22<-kmeans(disty,22)$cluster
par(mfrow=c(2,2))
s=FALSE
clusplot(disty, diss=TRUE, kay19, color=FALSE, shade=FALSE, lines=0, col.p=kay19, main="KMEANS", sub="19 assortments",span=s)
clusplot(disty, diss=TRUE, kay20, color=FALSE, shade=FALSE, lines=0, col.p=kay20, main="KMEANS", sub="20 assortments",span=s)
clusplot(disty, diss=TRUE, kay21, color=FALSE, shade=FALSE, lines=0, col.p=kay21, main="KMEANS", sub="21 assortments",span=s)
clusplot(disty, diss=TRUE, kay22, color=FALSE, shade=FALSE, lines=0, col.p=kay22, main="KMEANS", sub="22 assortments",span=s)