大数据量R中的轮廓计算

大数据量R中的轮廓计算,r,memory,cluster-analysis,k-means,silhouette,R,Memory,Cluster Analysis,K Means,Silhouette,我想计算用于聚类评估的轮廓。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,

我想计算用于聚类评估的轮廓。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)
该代码适用于较小的数据,例如具有50000 obs的数据,但是我遇到了类似错误的错误:当数据大小稍大时,无法分配大小为704.5 Gb的向量。对于Dunn索引和其他大型数据集的内部索引来说,这可能是个问题

我的电脑里有32GB的内存。问题来自计算数据。我想知道是否可以不预先计算距离数据,并在轮廓公式中需要时计算相应的距离


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

您可以自己实现轮廓

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

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


你应该考虑只使用一个子样本,你真的需要考虑所有的点吗?以及其他选择,如简化的轮廓,特别是与KMeans。。。在这种方法上,额外的数据只会让你收获很少。所以您可以只使用一个子样本。

您可以自己实现剪影

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

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


你应该考虑只使用一个子样本,你真的需要考虑所有的点吗?以及其他选择,如简化的轮廓,特别是与KMeans。。。在这种方法上,额外的数据只会让你收获很少。所以你可以只使用一个子样本。

任何一个mouse答案都是完美的,尤其是子样本。由于计算成本的增加,这对于非常大的数据集非常重要

这里是另一个使用clusterCrit的R包计算内部度量(如剪影和Dunn指数)的解决方案。clusterCrit用于计算聚类验证指数,它不需要预先计算整个距离矩阵。然而,正如Anony Mouse所讨论的,它可能会很慢。有关clusterCrit的文档,请参见以下链接:

clusterCrit还计算用于群集验证的大多数内部度量

例如:

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

任何一个慕斯答案都是完美的,尤其是二次抽样。由于计算成本的增加,这对于非常大的数据集非常重要

这里是另一个使用clusterCrit的R包计算内部度量(如剪影和Dunn指数)的解决方案。clusterCrit用于计算聚类验证指数,它不需要预先计算整个距离矩阵。然而,正如Anony Mouse所讨论的,它可能会很慢。有关clusterCrit的文档,请参见以下链接:

clusterCrit还计算用于群集验证的大多数内部度量

例如:

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

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

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

作为结论线索::get_剪影,它减少了使用相同的时间和内存。

如果可以计算剪影索引,而不使用距离矩阵,您也可以使用线索包,优化集群包使用的时间和内存。以下是一个例子:

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

作为结论线索::get_剪影,它减少了用于相同的时间和内存。

感谢Anony Mouse,我如何使用子样本或简化剪影?您是否有任何示例,例如代码或参考?当我使用all数据时,结果是否足够接近?对于子样本,我添加了ind_ss感谢Anony Mouse,我如何使用子样本或简化轮廓?您是否有任何示例,例如代码或参考?当我使用all数据时,结果是否足够接近?对于子样本,我添加了ind_ss