内存问题:使用Gower距离和k-medoids在{R}中使用非常大的多比例数据进行聚类分析

时间:2017-07-25 15:15:45

标签: r out-of-memory cluster-analysis large-data

我有一个非常大的数据框,名为'data',有350000行和138列,我想用它来进行k-medoids聚类。我正在使用该页面中的代码:http://dpmartin42.github.io/blogposts/r/cluster-mixed-types

这是我的代码:

packages <- c("dplyr", "ISLR", "cluster", "Rtsne", "ggplot2")


if (length(setdiff(packages, rownames(installed.packages()))) > 0) {
install.packages(setdiff(packages, rownames(installed.packages())))  
}

rm(packages)

library(dplyr) # for data cleaning
library(ISLR) # for college dataset
library(cluster) # for gower similarity and pam
library(Rtsne) # for t-SNE plot
library(ggplot2) # for visualization

data <- read.csv("data.csv", sep = ";")


## creation of dissimilarity matrix using "Gower distance" for mixed data 
##types
gower_dist <- daisy(data,
                metric = "gower",
                type = list())
gower_mat <- as.matrix(gower_dist)
#write.table(gower_mat, file = "dissimilarity.csv")
#summary(gower_dist)


sil_width <- c(NA)
for(l in 2:8){

pam_fit <- pam(gower_dist,
             diss = TRUE,
             k = l)

sil_width[l] <- pam_fit$silinfo$avg.width
}

nclust <- which.max(sil_width) # identify index of highest value
opt.value <- max(sil_width, na.rm = TRUE) # identify highest value
ncluster <- round(mean(nclust))
valcluster <- max(opt.value)

## start PAM clustering with n clusters
pam_fit <- pam(gower_dist, diss = TRUE, k = ncluster)

pam_results <- data.sample %>%
mutate(cluster = pam_fit$clustering) %>%
group_by(cluster) %>%
do(the_summary = summary(.))


#pam_results$the_summary

#data.sample[pam_fit$medoids, ]


tsne_obj <- Rtsne(gower_dist, is_distance = TRUE)

tsne_data <- tsne_obj$Y %>%
  data.frame() %>%
  setNames(c("X", "Y")) %>%
  mutate(cluster = factor(pam_fit$clustering))

ggplot(aes(x = X, y = Y), data = tsne_data) +
geom_point(aes(color = cluster)) 

我想要执行的步骤是:

1)使用Gower距离为多尺度数据创建相异度矩阵

2)寻找最佳簇数

3)执行k-medoids聚类

4)使用Rtsne可视化聚类以实现多维数据的可视化

该代码适用于最多10000行的数据子集。

如果我尝试在更多行上执行代码,则会出现内存问题。对于整个数据帧,我得到错误: '错误:无法分配大小为506.9 GB的向量' 这是在步骤

创建的
gower_dist <- daisy(data.sample,
                metric = "gower",
                type = list(),
                warnType = FALSE) # suppress warning regarding data type

我知道不相似矩阵的创建需要大量的RAM。 所以我的问题不是关于编码而是关于方法:是否有任何有意义的方法来创建相异矩阵并在整个数据帧上执行聚类? 我在考虑两种选择:

选项1:以1000行的步长迭代创建相异度矩阵。我不确定这是否有意义,因为矩阵显示每行的每一行。

选项2:创建一个for循环,其中包含随机选择1000行数据子集的所有步骤,所有步骤重复多次,直到达到代表性聚类。我也不确定这是否合理。

是否可以在R?

中的非常大的数据集上执行上述代码

1 个答案:

答案 0 :(得分:2)

SLINK只需要线性内存。 DBSCAN和OPTICS也是如此。

DBSCAN参数化有点棘手(epsilon的值是多少?),但OPTICS值得一试。我不知道Gower是否可以编入索引,以加速算法。

但是你以后会在tSNE遇到同样的问题!

我要考虑的是首先使用可管理的子集。然后,一旦你知道什么有效,你可以使用所有数据(使用DBSCAN,你可以尝试使用相同的epsilon,但增加minPts用于更大的数据大小)。或者,您只需将剩余的点添加到与样本中最近邻居相同的群集中。