R中的模糊C均值聚类

时间:2018-11-13 15:25:46

标签: r cluster-analysis

我正在对某些数据执行模糊聚类。我首先缩放数据帧,以使每个变量的均值分别为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个群集吗?我该如何解释?我不知道如何重新创建我的数据,因为它很大。还有其他人遇到过吗?

2 个答案:

答案 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