【问题标题】:silhouette calculation in R for a large data大数据的R中的轮廓计算
【发布时间】:2019-07-14 02:16:25
【问题描述】:

我想为集群评估计算轮廓。 R中有一些包,例如cluster和clValid。这是我使用集群包的代码:

# load the data
# a data from the UCI website with 434874 obs. and  3 variables
data <- read.csv("./data/spatial_network.txt",sep="\t",header =  F)

# apply kmeans
km_res <- kmeans(data,20,iter.max = 1000,
               nstart=20,algorithm="MacQueen")

# calculate silhouette
library(cluster)   
sil <- silhouette(km_res$cluster, dist(data))

# plot silhouette
library(factoextra)
fviz_silhouette(sil)

该代码适用于较小的数据,例如 50,000 obs 的数据,但是当数据大小有点大时,我会收到类似“错误:无法分配大小为 704.5 Gb 的向量”的错误。这可能是 Dunn 索引和大型数据集的其他内部索引的问题。

我的电脑中有 32GB RAM。问题来自计算 dist(data)。我想知道是否可以不提前计算 dist(data),并在剪影公式中需要时计算相应的距离。

感谢您对这个问题的帮助,以及我如何计算大型和超大型数据集的轮廓。

【问题讨论】:

    标签: r memory cluster-analysis k-means silhouette


    【解决方案1】:

    您可以自己实现 Silhouette。

    它只需要每个距离两次,因此不需要存储整个距离矩阵。它可能会运行得慢一些,因为它计算了两次距离,但同时更好的内存效率可能会弥补这一点。

    不过,这仍然需要很长时间。

    您应该考虑仅使用子样本(您真的需要考虑所有点吗?)以及诸如简化剪影之类的替代方法,尤其是使用 KMeans...您只会获得很少有关此类方法的额外数据。所以你可以只使用一个子样本。

    【讨论】:

    • 感谢 Anony-Mousse,我如何使用子样本或简化剪影?您有任何示例(例如代码)或参考吗?结果是否足够接近我使用所有数据时的结果?
    • 对于子样本,我添加了 ind_ss
    【解决方案2】:

    Anony-Mousse 答案是完美的,尤其是二次抽样。由于计算成本的增加,这对于非常大的数据集非常重要。

    这是另一种使用 clusterCrit 的 R 包计算内部度量值(例如剪影和 Dunn 指数)的解决方案。 clusterCrit 用于计算聚类验证指标,不需要预先计算整个距离矩阵。然而,正如 Anony-Mousse 所讨论的那样,它可能会很慢。有关 clusterCrit 的文档,请参阅以下链接: https://www.rdocumentation.org/packages/clusterCrit/versions/1.2.8/topics/intCriteria

    clusterCrit 还计算集群验证的大部分内部度量。

    例子:

    intCriteria(data,km_res$cluster,c("Silhouette","Calinski_Harabasz","Dunn"))
    

    【讨论】:

      【解决方案3】:

      如果可以不使用距离矩阵计算轮廓索引,或者您可以使用线索包,优化集群包使用的时间和内存。这是一个例子:

      library(rbenchmark)
      library(cluster)
      library(clues)
      
      set.seed(123)
      x = c(rnorm(1000,0,0.9), rnorm(1000,4,1), rnorm(1000,-5,1))
      y = c(rnorm(1000,0,0.9), rnorm(1000,6,1), rnorm(1000, 5,1))
      cluster = rep(as.factor(1:3),each = 1000)
      
      df <- cbind(x,y)
      head(df)
                     x           y
      [1,] -0.50442808 -0.13527673
      [2,] -0.20715974 -0.29498142
      [3,]  1.40283748 -1.30334876
      [4,]  0.06345755 -0.62755613
      [5,]  0.11635896  2.33864121
      [6,]  1.54355849 -0.03367351
      

      两个函数的运行时比较

       benchmark(f1 = silhouette(as.integer(cluster), dist = dist(df)),
                 f2 = get_Silhouette(y = df, mem = cluster))
        test replications elapsed relative user.self sys.self user.child sys.child
      1   f1          100   15.16    1.902     13.00     1.64         NA        NA
      2   f2          100    7.97    1.000      7.76     0.00         NA        NA
      

      两个函数的内存使用比较

      library(pryr)
      object_size(silhouette(as.integer(cluster), dist = dist(df)))
      73.9 kB
      object_size(get_Silhouette(y = df, mem = cluster))
      36.6 kB
      

      作为结论clues::get_Silhouette,它减少了使用的时间和内存。

      【讨论】:

        猜你喜欢
        • 2023-03-21
        • 1970-01-01
        • 2012-01-14
        • 1970-01-01
        • 2010-11-01
        • 1970-01-01
        • 2014-11-20
        • 1970-01-01
        • 2010-10-20
        相关资源
        最近更新 更多