首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大数据R中的剪影计算

大数据R中的剪影计算
EN

Stack Overflow用户
提问于 2019-02-20 11:40:50
回答 3查看 4.3K关注 0票数 1

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

代码语言:javascript
复制
# 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次数据,代码运行良好,但是当数据大小有点大时,我会得到一个错误,如" error :无法分配大小为704.5 Gb的向量“。这可能是Dunn索引和大型数据集的其他内部索引的问题。

我的电脑里有32 my的内存。这个问题来自计算dist(数据)。我想知道是否有可能事先不计算dist(数据),并在剪影公式中需要时计算相应的距离。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-20 22:01:01

你可以自己实现剪影。

它只需要每次距离两次,所以存储一个完整的距离矩阵是不必要的。它的运行速度可能会慢一点,因为它会计算两次距离,但同时,更好的内存效率可能会弥补这一点。

不过,这还需要很长时间。

你应该考虑只使用子样本(你真的需要考虑所有的点吗?)以及其他选择,如简化轮廓,特别是与KMeans.关于这些方法的额外数据只会得到很少的好处。所以你可以用一个子样本。

票数 4
EN

Stack Overflow用户

发布于 2019-02-26 03:05:26

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

这是另一种计算内部度量的解决方案,例如使用clusterCrit的R包来计算轮廓和邓恩索引。clusterCrit是用来计算聚类验证指标的,它不需要预先完成整个距离矩阵。然而,这可能是缓慢的,如非尼-穆斯讨论。有关clusterCrit的文档,请参见下面的链接:https://www.rdocumentation.org/packages/clusterCrit/versions/1.2.8/topics/intCriteria

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

示例:

代码语言:javascript
复制
intCriteria(data,km_res$cluster,c("Silhouette","Calinski_Harabasz","Dunn"))
票数 1
EN

Stack Overflow用户

发布于 2019-05-28 19:33:35

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

代码语言:javascript
复制
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

两个函数的运行时比较

代码语言:javascript
复制
 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

两个函数内存使用情况的比较

代码语言:javascript
复制
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,它减少了时间和内存使用的相同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54785525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档