r - R中大数据的轮廓计算

我想计算聚类评估的剪影。 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 内存。问题来自于计算 dist(data)。我想知道是否可以不预先计算 dist(data) ,并在轮廓公式中需要时计算相应的距离。

非常感谢您就此问题以及我如何计算大型和超大型数据集的剪影提供的帮助。

最佳答案

您可以自己实现 Silhouette。

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

不过还需要很长时间。

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

https://stackoverflow.com/questions/54785525/

相关文章:

reactjs - 当 URL 包含多个路径时 React Router 不工作

spring-boot - 如何将base64转换为java中的MultipartFile

django - 从 Django 模型中的选择中获取人类可读名称的实际值

r - 从分布到置信区间的寓言

c++ - 为什么 mersenne_twister_engine 保证某些结果?

scala - 使用 Scala 将多列转换为 Spark Dataframe 上的一列 map

unicode - 为什么 unicode 代码点的 UTF-8 编码不能放入 3 个字节

angular - NgRx - 从后端获取错误验证并传递给组件

scala - 如何测量 Cats IO 效果中的耗时?

xamarin - 使用 xamarin 表单从页面中删除向后滑动手势