簡體   English   中英

內存問題:使用Gower距離和k型矩對R中的超大型多尺度數據進行聚類分析

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM