我注意到關於這個問題的方法和flexclust方法的一些事情是,它們相當慢(基準測試集合中有100萬個觀察結果和2個特徵)。
件原始模型是相當快的:
set.seed(144)
df1 <- data.frame(x=runif(1e6), y=runif(1e6))
df2 <- data.frame(x=runif(1e6), y=runif(1e6))
system.time(km <- kmeans(df1, centers=3))
# user system elapsed
# 1.204 0.077 1.295
我張貼在這個問題的解決方案是在計算測試設置羣集分配緩慢,因爲它單獨調用closest.cluster
爲每個測試設定點:
system.time(pred.test <- apply(df2, 1, closest.cluster))
# user system elapsed
# 42.064 0.251 42.586
同時,flexclust包似乎增添了不少開銷,無論我們把與as.kcca
擬合模型或安裝一個新的自己與kcca
(雖然PR ediction末的速度要快得多)
# APPROACH #1: Convert from the kmeans() output
system.time(km.flexclust <- as.kcca(km, data=df1))
# user system elapsed
# 87.562 1.216 89.495
system.time(pred.flexclust <- predict(km.flexclust, newdata=df2))
# user system elapsed
# 0.182 0.065 0.250
# Approach #2: Fit the k-means clustering model in the flexclust package
system.time(km.flexclust2 <- kcca(df1, k=3, kccaFamily("kmeans")))
# user system elapsed
# 125.193 7.182 133.519
system.time(pred.flexclust2 <- predict(km.flexclust2, newdata=df2))
# user system elapsed
# 0.198 0.084 0.302
似乎有另一種明智的做法在這裏:使用快速k最近像kd樹的鄰居解決發現的內每個測試設置觀察近鄰集羣質心集。這可以緊湊地寫和比較快速的:
library(FNN)
system.time(pred.knn <- get.knnx(km$center, df2, 1)$nn.index[,1])
# user system elapsed
# 0.315 0.013 0.345
all(pred.test == pred.knn)
# [1] TRUE
[這是一個很好的資源嘗試不同的聚類方法有R代碼和解釋](http://manuals.bioinformatics.ucr.edu/home/R_BioCondManual# TOC-Clustering-Exercises)還有[biganalytics包](http://cran.r-project.org/web/packages/biganalytics/biganalytics.pdf),它不依賴於記憶,並且有一個K-means算法 – marbel
向學生介紹apply()(他們最終會反覆使用它)似乎更加明智,並且使用相對簡單的方法,而不是將它們引入到一堆不同的包中,這些包在特殊場合下必須記住(如果他們再次使用它們)。 – naught101