2017-07-25 15 views
1

我有一个非常大的数据框,名为'data',有350000行和138列,我想用于k - 类群聚类。我使用从该页面的代码:http://dpmartin42.github.io/blogposts/r/cluster-mixed-types内存问题:使用Gower距离和k-medoids对R中的非常大的多比例数据进行聚类分析

这是我的代码:

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)使用高尔距离的多尺度创建相异矩阵数据

2)寻找簇的最佳数目

3)执行的K-中心点划分聚类

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中的超大型数据集上执行上面的代码?

+0

你有多少重复行? –

+0

Kmedoids真的很糟糕。 500 GB听起来似乎对我来说合情合理。不要在这些数据上使用基于距离矩阵的算法。 –

+0

我有大约3000个重复的行。感谢您的建议。我想使用kmedoids,因为它能够将Gower距离用于多尺度数据。你有什么建议,哪种算法可以用于大型多尺度数据而不使用距离矩阵?任何提示都会有用。 – Elena

回答

2

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

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

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

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