2011-03-14 6 views
11

ベクトル(10^5前後の長さ)を5つのクラスに分割したいと思います。関数classIntervalsのパッケージclassIntからは、style = "jenks"の自然なブレークを使用したかったのですが、これはほんの僅か500のベクトルであっても過度の時間がかかります。style = "kmeans"はほとんど瞬時に実行されます。クラスへの分割:jenksとkmeans

library(classInt) 

my_n <- 100 
set.seed(1) 
x <- mapply(rnorm, n = my_n, mean = (1:5) * 5) 

system.time(classIntervals(x, n = 5, style = "jenks")) 
R> system.time(classIntervals(x, n = 5, style = "jenks")) 
    user system elapsed 
    13.46 0.00 13.45 

system.time(classIntervals(x, n = 5, style = "kmeans")) 
R> system.time(classIntervals(x, n = 5, style = "kmeans")) 
    user system elapsed 
    0.02 0.00 0.02 

Jenksアルゴリズムは非常に遅くて、実行速度が速いのはなぜですか?

必要であれば、私はstats.stackexchange.comするために、質問の最後の二つの部分に移動します:ジェンクスのための合理的な代替を関数kmeansさ

  • どのような状況下では?
  • データポイントのランダムな1%サブセットでclassIntを実行してクラスを定義することは妥当ですか?
+2

巨大です。 'kmeans'は最初のクラスタ中心としてサンプルのランダムなセットを使います。再現性のある結果を得るには、 'set.seed()'を介してシードを設定し、k-meansとローカルとグローバルの最小値について読んでください。これは '?classIntervals'に記述されています。 –

+0

ありがとうございました。私はその部分を投稿した直後に見つけて、その質問を編集しました。 –

+0

私は、ジンクの休憩がクオンタイルよりも優れていると示唆する証拠はほとんどないと思います。 – hadley

答えて

6

あなたの元の質問に答えるために:

を何ジェンクスアルゴリズムがとても遅くなり、 実行それへのより高速な方法はありますか?

実際、一方ジェンクスアルゴリズム、BAMMtoolsパッケージでsetjenksBreaks機能を適用するより高速な方法があります。

しかし、あなたはBAMMtoolsで6にsetjenksBreaks機能をブレークを設定する必要がclassIntパッケージのclassIntervals機能で5にブレークを設定するすなわちている場合、あなたは異なっ休憩の回数を設定する必要があることに注意してくださいパッケージを使用して同じ結果を得る。

# Install and load library 
install.packages("BAMMtools") 
library(BAMMtools) 

# Set up example data 
my_n <- 100 
set.seed(1) 
x <- mapply(rnorm, n = my_n, mean = (1:5) * 5) 

# Apply function 
getJenksBreaks(x, 6) 

スピードアップは、機能のヘルプを読んでください、すなわち

> microbenchmark(getJenksBreaks(x, 6, subset = NULL), classIntervals(x, n = 5, style = "jenks"), unit="s", times=10) 
Unit: seconds 
             expr   min   lq  mean  median   uq   max neval cld 
     getJenksBreaks(x, 6, subset = NULL) 0.002824861 0.003038748 0.003270575 0.003145692 0.003464058 0.004263771 10 a 
classIntervals(x, n = 5, style = "jenks") 2.008109622 2.033353970 2.094278189 2.103680325 2.111840853 2.231148846 10