R 中的模糊 C 均值聚类

Fuzzy C-Means Clustering in R

我正在对一些数据执行模糊聚类。我首先缩放数据框,因此每个变量的平均值为 0,标准差为 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 是最好的簇数。因此我 运行 cluster 包中的 fanny 函数如下:

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 个集群吗?我该如何解释呢?我不知道如何重新创建我的数据,因为它非常大。其他人以前遇到过这个吗?

首先,我鼓励阅读 clValid package 的精彩小插图。 R 包 clValid 包含用于验证聚类分析结果的函数。可以使用三种主要类型的集群验证措施。其中一项措施是邓恩指数,即不在同一集群中的观察值与较大的集群内距离之间的比率。为简单起见,我关注 Dunn 指数。一般来说,连接性应该最小化,而邓恩指数和轮廓宽度都应该最大化。 clValid 创建者在他们的文档中明确提到 cluster 包的 fanny 功能。

clValid 包可用于 运行 多个 algorithms/metrics 跨预先指定的聚类集。

library(dplyr)
library(clValid)
iris
table(iris$Species)
clust <- sapply(iris[, -5], scale)

在我的代码中,我需要增加迭代以达到收敛 (maxit = 1500)。 结果是通过将汇总函数应用于 clValid 对象 intvalid 获得的。 似乎最佳的簇数是2(但这里不是重点)。

 intvalid <- clValid(clust, 2:5, clMethods=c("fanny"), 
                    maxit = 1500,
                    validation="internal",
                    metric="euclidean")
 summary(intvalid)

可以从 clValid 对象中提取任何方法的结果,以便使用 clusters 方法进行进一步分析。这里提取了 2 个聚类解的结果 (hc$2),重点是 Dunnett 系数 (hc$2$coeff)。当然,这个结果与 clValid 调用的 "euclidean" 指标有关。

hc <- clusters(intvalid, "fanny")
hc$`2`$coeff

现在,我只需使用欧氏度量和 2 个集群从 cluster 包中调用 fanny。结果与上一步完全重叠。

res.fanny <- fanny(clust, 2, metric='euclidean', maxit = 1500)
res.fanny$coeff

现在,我们可以看一下分类table

 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

这是基于有限信息的回答尝试,可能无法完全解决提问者的情况。听起来可能还有其他问题。在聊天中,他们表示他们遇到了我无法重现的其他错误。 Fanny 将根据指标计算项目并将其分配给 "crisp" 个集群。它还将生成一个矩阵,显示可以使用 membership 访问的模糊聚类分配。

可以通过使用 iris 数据集增加 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 参数。这将收紧集群分配。或者,如果您正在进行某种监督学习,调整此参数的一个过程是保留一些测试数据,进行超参数网格搜索,然后 select 在您的首选指标上产生最佳结果的值。然而,在不了解更多关于任务、数据或提问者试图完成的内容的情况下,很难提出比这更多的建议。