簡體   English   中英

大型數據集上的 R 中的 hclust()

[英]hclust() in R on large datasets

我正在嘗試在 R 中實現層次聚類: hclust() ; 這需要一個由 dist() 創建的距離矩陣,但我的數據集有大約一百萬行,甚至 EC2 實例也耗盡了 RAM。 有解決方法嗎?

一種可能的解決方案是對數據進行采樣,對較小的樣本進行聚類,然后將聚類后的樣本視為 k 最近鄰的訓練數據,並對其余數據進行“分類”。 這是一個包含 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. 因為我創建了數據,所以我知道選擇三個集群。 對於真正的問題,您必須進行計算適當數量的集群的工作。
  2. 采樣 1/220 可能會完全錯過任何小集群。 在小樣本中,它們看起來就像噪音。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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