[英]Memory issues: Cluster-analysis with very large multi-scaled data in R using Gower distance and k-medoids
我有一個非常大的數據框,名為“ 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的向量”,這是在步驟1中創建的
gower_dist <- daisy(data.sample,
metric = "gower",
type = list(),
warnType = FALSE) # suppress warning regarding data type
我知道,差異矩陣的創建需要大量RAM。 因此,我的問題不是關於編碼,而是關於方法:是否有有意義的方法來創建相異矩陣並在整個數據幀上執行聚類? 我在考慮兩種選擇:
選項1:以1000行為步長創建相異度矩陣迭代。 我不確定這是否有意義,因為矩陣按行顯示了每一行。
選項2:創建一個包含所有步驟的for循環,其中隨機選擇1000行的數據子集,並將所有步驟重復多次,直到達到代表性的聚類為止。 我也不確定這是否有意義。
是否可以在R中的大型數據集上執行以上代碼?
SLINK僅需要線性存儲器。 DBSCAN和OPTICS也是如此。
DBSCAN進行參數設置(epsilon的哪個值?)會有些棘手,但是OPTICS值得一試。 我不知道是否可以索引Gower以加速算法。
但是稍后您將在tSNE中遇到相同的問題!
我會考慮的是首先僅使用可管理的子集。 然后,一旦知道有效的方法,就可以使用所有數據(通過DBSCAN,您可以嘗試使用相同的epsilon,但增加minPts以獲得更大的數據大小)。 或者,您只需將其余點與樣本中最近的鄰居添加到同一群集中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.