我正在对某些数据执行模糊聚类。我首先缩放数据帧,以使每个变量的均值分别为0
和sd 1.
,然后从包clValid
中运行clValid
函数,如下所示:
library(dplyr)
df<-iris[,-5] # I do not use iris, but to make reproducible
clust<-sapply(df,scale)
intvalid <- clValid(clust, 2:10, clMethods=c("fanny"),
validation="internal", maxitems = 1000)
结果告诉我4个是群集的最佳数目。因此,我从fanny
包运行了cluster
函数,如下所示:
res.fanny <- fanny(clust, 4, metric='SqEuclidean')
res.fanny$coeff
res.fanny$k.crisp
df$fuzzy<-res.fanny$clustering
profile<-ddply(df,.(fuzzy),summarize,
count=length(fuzzy))
但是,在查看profile
时,我只有3个簇,而不是4个。这怎么可能?我应该使用3个群集而不是4个群集吗?我该如何解释?我不知道如何重新创建我的数据,因为它很大。还有其他人遇到过吗?
答案 0 :(得分:3)
这是基于有限的信息的一种尝试,它可能无法完全解决发问者的情况。听起来可能还有其他问题。在聊天中,他们表示他们遇到了我无法复制的其他错误。 Fanny将基于指标计算项目并将其分配给“酥脆”群集。它还将产生一个矩阵,显示可使用membership
访问的模糊聚类分配。
可以通过使用虹膜数据集增加memb.exp
参数来重新创建发问者所描述的问题。这是一个示例:
library(plyr)
library(clValid)
library(cluster)
df<-iris[,-5] # I do not use iris, but to make reproducible
clust<-sapply(df,scale)
res.fanny <- fanny(clust, 4, metric='SqEuclidean', memb.exp = 2)
调用res.fanny$k.crisp
表明这会产生4个清晰的簇。
res.fanny14 <- fanny(clust, 4, metric='SqEuclidean', memb.exp = 14)
调用res.fanny14$k.crisp
表明产生了3个清晰的簇。
一个人仍然可以使用res.fanny14$membership
访问4个集群中每个集群的成员资格。
如果您有充分的理由认为应该有4个清晰的群集,则可以减少memb.exp
参数。这将收紧群集分配。或者,如果您要进行某种监督学习,则调整此参数的一个步骤是保留一些测试数据,进行超参数网格搜索,然后选择在首选度量标准上产生最佳结果的值。但是,如果不了解任务,数据或发问者要完成的任务,就很难提出更多建议。
答案 1 :(得分:1)
首先,我鼓励阅读clValid package的精美插图。
R软件包clValid
包含用于验证聚类分析结果的函数。可用的群集验证措施有三种主要类型。其中一项措施是Dunn指数,即不在同一聚类中的观测值与较大聚类内距离之间的比率。为了简单起见,我关注Dunn索引。通常,应将连接性最小化,而Dunn索引和轮廓宽度都应最大化。
clValid
创建者在其文档中明确引用了fanny
包的cluster
函数。
clValid
软件包对于在一组预先指定的集群中运行多种算法/指标很有用。
library(dplyr)
library(clValid)
iris
table(iris$Species)
clust <- sapply(iris[, -5], scale)
在我的代码中,我需要增加迭代次数以达到收敛(maxit = 1500)。 通过将摘要函数应用于clValid对象无效而获得结果。 似乎集群的最佳数量是2(但这不是要点)。
intvalid <- clValid(clust, 2:5, clMethods=c("fanny"),
maxit = 1500,
validation="internal",
metric="euclidean")
summary(intvalid)
可以使用clValid
方法从clusters
对象中提取任何方法的结果以进行进一步分析。在这里,提取了两个聚类解的结果(hc$
2),重点放在了Dunnett系数(hc$
2 $coeff
)上。当然,此结果与clValid
调用的“欧几里得”度量标准有关。
hc <- clusters(intvalid, "fanny")
hc$`2`$coeff
现在,我只需使用欧几里德度量标准和2个簇从fanny
包中调用cluster
。结果与上一步完全重叠。
res.fanny <- fanny(clust, 2, metric='euclidean', maxit = 1500)
res.fanny$coeff
现在,我们可以看一下分类表
table(hc$`2`$clustering, iris[,5])
setosa versicolor virginica
1 50 0 0
2 0 50 50
并转到profile
df$fuzzy <- hc$`2`$clustering
profile <- ddply(df,.(fuzzy), summarize,
count=length(fuzzy))
profile
fuzzy count
1 1 50
2 2 100