2017-07-25 15 views
1

私はkに使用したい350000行と138列の 'data'という非常に大きなデータフレームを持っています - メデイアクラスタリング。私は、そのページからのコードを使用しています:http://dpmartin42.github.io/blogposts/r/cluster-mixed-typesメモリの問題:Gower distanceと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)マルチスケールのためGowerの距離を用いて非類似度行列を作成します。

2データ

)クラスタの最適数を探し

3)を実行K-medoidsクラスタリング

4)多次元データを視覚化するためにRtsneを使用してクラスタリングを可視化する

コードは、最大10000行までのデータサブセットに対して正常に機能します。

もっと多くの行でコードを実行しようとすると、メモリの問題が発生します。 「エラー:サイズ506.9ギガバイトのベクトル割り当てることができない」私はエラーを取得し、全データフレームとステップ

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

で作成され を私は非類似度行列の作成は多くのRAMを必要としていることを知っています。 私の質問はコーディングではなく、方法論に関するものです。相違行列を作成し、データフレーム全体でクラスタリングを実行する意味のある方法はありますか? 私は2つの選択肢について考えていました:

オプション1:1000行のステップで相違度行列反復を作成します。行列が各行で各行を表示するので、これが意味をなさないかどうかはわかりません。

オプション2:1000行のデータサブセットがランダムに選択され、すべてのステップが代表的なクラスタリングに達するまで何回も繰り返されるすべてのステップでforループを作成します。これが意味をなさないかどうかもわかりません。

Rの非常に大きなデータセットで上記のコードを実行することはできますか?

+0

重複する行はいくつありますか? –

+0

Kmedoidsは本当にひどくスケールします。私には500GBの音が聞こえました。そのようなデータに距離行列に基づくアルゴリズムを使用しないでください。 –

+0

私は約3000の重複した行を持っています。ご指摘ありがとうございます。私はkmedoidを使用したかったのは、マルチスケールデータにGower距離を使用できるためです。距離行列を使用せずに大規模なマルチスケールデータに使用できるアルゴリズムはありますか?どんなヒントも役に立つでしょう。 – Elena

答えて

2

SLINKには線形メモリのみが必要です。 DBSCANとオプティクスも。

DBSCANはパラメータ化するのが少し難しいでしょうか(εの値はどれですか?)、しかしOPTICSは試してみる価値があります。アルゴリズムを高速化するために、Gowerが索引付けできるかどうかわかりません。

しかし、後でtSNEで同じ問題が発生します!

私が考えているのは、最初は管理可能なサブセットのみで作業することです。そして、いったん何がうまくいけば、すべてのデータを使うことができます(DBSCANを使うと、同じイプシロンを使うことができますが、より大きなデータサイズのためにminPtsを増やすことができます)。または、サンプル内の最も近い隣のものと同じクラスタに残りの点を追加するだけです。

関連する問題