5

R で階層的クラスタリングを実装しようとしています: hclust() ; これには dist() によって作成された距離行列が必要ですが、私のデータセットには約 100 万行あり、EC2 インスタンスでさえ RAM が不足しています。回避策はありますか?

4

1 に答える 1

7

これに対する考えられる解決策の 1 つは、データをサンプリングし、小さい方のサンプルをクラスター化してから、クラスター化されたサンプルを k Nearest Neighbors のトレーニング データとして扱い、残りのデータを「分類」することです。110 万行の簡単な例を次に示します。5000点のサンプルを使用しています。元のデータは十分に分離されていませんが、データの 1/220 のみでサンプルが分離されています。あなたの質問は に言及していたのでhclust、それを使用しました。ただし、dbscan や平均シフトなどの他のクラスタリング アルゴリズムを使用することもできます。

## Generate data
set.seed(2017)
x = c(rnorm(250000, 0,0.9), rnorm(350000, 4,1), rnorm(500000, -5,1.1))
y = c(rnorm(250000, 0,0.9), rnorm(350000, 5.5,1), rnorm(500000,  5,1.1))
XY = data.frame(x,y)
Sample5K = sample(length(x), 5000)     ## Downsample

## Cluster the sample
DM5K = dist(XY[Sample5K,])
HC5K = hclust(DM5K, method="single")
Groups = cutree(HC5K, 8)
Groups[Groups>4] = 4
plot(XY[Sample5K,], pch=20, col=rainbow(4, alpha=c(0.2,0.2,0.2,1))[Groups])

クラスター化されたサンプル

次に、他のすべてのポイントを最も近いクラスターに割り当てます。

Core = which(Groups<4)
library(class)
knnClust = knn(XY[Sample5K[Core], ], XY, Groups[Core])
plot(XY, pch=20, col=rainbow(3, alpha=0.1)[knnClust])

クラスター化された完全なデータ

いくつかの簡単なメモ。

  1. データを作成したので、3 つのクラスターを選択する必要があることはわかっていました。実際の問題では、適切な数のクラスターを計算する作業を行う必要があります。
  2. 1/220 をサンプリングすると、小さなクラスターが完全に見落とされる可能性があります。小さなサンプルでは、​​ノイズのように見えます。
于 2017-01-01T01:06:14.870 に答える