【发布时间】:2017-12-31 14:53:15
【问题描述】:
我有一个非常大的名为“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) 使用高尔距离为多尺度数据创建相异矩阵
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 中对非常大的数据集执行上述代码?
【问题讨论】:
-
你有多少重复行?
-
Kmedoids 的扩展性非常糟糕。 500 GB 对我来说听起来很合理。不要对此类数据使用基于距离矩阵的算法。
-
我有大约 3000 个重复行。感谢您的意见。我想使用 kmedoids,因为它能够将 Gower 距离用于多尺度数据。您有什么建议,可以在不使用距离矩阵的情况下将哪种算法用于大型多尺度数据?任何提示都会很有用。
标签: r out-of-memory cluster-analysis large-data