2016-12-06 98 views
2

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

+0

這裏最好的方法可能是使數據的子集彼此最接近(也許使用另一種聚類算法,如KNN),然後對這些子集進行分級聚類,然後最終分配每個聚類層次結構中的位置。 [這篇文章](http://stackoverflow.com/questions/9156961/hierarchical-clustering-of-1-million-objects)討論了這個基本思想。這篇文章的實現在[tag:python]中,但大部分只是討論想法,而不是代碼。 – Barker

+0

此外,具有用於分級聚類algorythm即更高效看看['Rclusterpp'包(https://cran.r-project.org/web/packages/Rclusterpp/vignettes/Rclusterpp.pdf)。 – Barker

+0

[在聚類大距離矩陣]的可能的複製(http://stackoverflow.com/questions/34281593/large-distance-matrix-in-clustering) – Barker

回答

2

一個可能的解決方案是取樣資料,羣集小的樣本,然後把聚集的樣品訓練數據k近鄰和「分類」數據的其餘部分。這裏有一個1.1M行的簡單例子。我使用了5000分的樣本。原始數據沒有很好的分離,但只有1/220的數據,樣本是分開的。由於你的問題涉及到hclust,我使用了。但是您可以使用其他聚類算法,如dbscan或mean shift。

## 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]) 

Clustered Sample

現在只要分配所有其他點到最近的集羣。

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]) 

Full Data Clustered

幾個簡單的音符。

  1. 因爲我所創建的數據,我知道該選擇三個集羣。有一個真正的問題,你將不得不做出確定適當數量的羣集的工作。
  2. 取樣1/220可能完全錯過任何小簇。在小樣本中,它們看起來像噪音。
+0

此聚類中的數據,它不這樣做的層次聚類。正常聚類只是將事物劃分爲一組數量,層次聚類爲所有數據生成一個「族譜」,爲每個單獨的數據點指定樹中的特定位置。 – Barker

+0

@巴克 - 是的。我同意。它不是對整個數據進行分層聚類。 – G5W

+0

最終結果是不是在所有層次聚類(或者最好是3個層次結構),你扔了所有的羣體之間的關係,當你砍倒,只用於前3個集羣爲您的分類。如果您保留了來自'hclust'的所有5000個組並將剩餘的數據分配給5000個分支中的每一個,那麼您可以得到一種半等級結構。然後,如果您在每個組上運行「hclust」,然後將它們掛鉤回樹中,則可以創建一個真正的層次結構(儘管存在一些潛在的錯誤)。 – Barker