代码之家  ›  专栏  ›  技术社区  ›  Jack Armstrong

R中的模糊C-均值聚类

  •  4
  • Jack Armstrong  · 技术社区  · 7 年前

    我正在对一些数据执行模糊聚类。我首先缩放数据帧,使每个变量的平均值为 0 及 1. 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 回复  |  直到 7 年前
        1
  •  3
  •   Ian Wesley    7 年前

    membership .

    memb.exp 参数使用iris数据集。以下是一个例子:

    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个脆簇,你可以减少 参数这将收紧集群分配。或者,如果您正在进行某种监督学习,调整此参数的一个步骤是保留一些测试数据,进行超参数网格搜索,然后选择在首选指标上产生最佳结果的值。然而,如果不了解更多关于任务、数据或提问者试图完成的任务,就很难提出更多的建议。

        2
  •  1
  •   paoloeusebi    7 年前

    首先,我鼓励大家读一读这本书的精彩片段 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对象intvalid的summary函数获得的。 看起来集群的最佳数量是2(但这里不是重点)。

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

    任何方法的结果都可以从 对象,以便使用 clusters 方法。这里提取了两个集群解决方案的结果( hc$ 2) ,重点是Dunnett系数( hc$ $coeff ). 当然,这一结果与该模型的“欧几里德”度量有关 clValid 呼叫

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

    现在,我只是打电话 屁股 从…起 簇

    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