[#42735] [Ruby 1.9-Feature#4147][Open] Array#sample で重みを指定したい — Yoji Ojima <redmine@...>

Feature #4147: Array#sample で重みを指定したい

52 messages 2010/12/10
[#42791] [Ruby 1.9-Feature#4147][Assigned] Array#sample で重みを指定したい — Shyouhei Urabe <redmine@...> 2010/12/18

チケット #4147 が更新されました。 (by Shyouhei Urabe)

[#42800] Re: [Ruby 1.9-Feature#4147][Assigned] Array#sample で重みを指定したい — Masaya TARUI <tarui@...> 2010/12/19

> じゃあ反対ないので実装はともかく、この仕様は基本入れる方向で考えましょう。反対の人は意思表示お早めに。

[#42763] [Ruby 1.9-Bug#4159][Open] test_block_variables(TestRipper::ParserEvents) が失敗する — Kouhei Yanagita <redmine@...>

Bug #4159: test_block_variables(TestRipper::ParserEvents) が失敗する

8 messages 2010/12/14

[#42894] [Ruby 1.8-Feature#4207][Open] これから「1.8.8」の話をしよう -- 1.8がこの先生きのこるには — Shyouhei Urabe <redmine@...>

Feature #4207: これから「1.8.8」の話をしよう -- 1.8がこの先生きのこるには

24 messages 2010/12/26
[#42935] Re: [Ruby 1.8-Feature#4207][Open] これから「1.8.8」の話をしよう -- 1.8がこの先生きのこるには — Kenta Murata <muraken@...> 2011/01/04

むらたです。

[#42936] Re: [Ruby 1.8-Feature#4207][Open] これから「1.8.8」の話をしよう -- 1.8がこの先生きのこるには — Kenta Murata <muraken@...> 2011/01/05

むらたです。

[ruby-dev:42817] Re: [Ruby 1.9-Feature#4147] Array#sample で重みを指定したい

From: Yusuke ENDOH <mame@...>
Date: 2010-12-20 03:43:24 UTC
List: ruby-dev #42817
遠藤です。

2010年12月20日1:27 Yoji Ojima <redmine@ruby-lang.org>:
> 私個人としては高速性に興味はなく、最初のサンプルのような処理を標準機能の範囲で簡潔に記述することができさえすれば満足です。

係数レベルの性能には私も大して興味ないんですが、オーダが違うとなると
さすがに気になります。特に、機能的には O(log n) で実現できるのに、
見た目の都合で API を O(n) にしか実装できないよう制約してしまおうと
いう話ですから。記述性の話もよくわかるので、悩ましいところですが。

R や Matlab などがこぞって O(n) の API を採用していることから、重み
付きサンプリングをしたいユースケースでは母集団はそんなに大きくない
ことが多いのでは、という予感がしてきています。
この事が確かめられれば、O(n) でもいいかなと思うんですが……。


> 単純な復元抽出に関しては (1..n).map { ary.sample } で代替できるので不要という意見に同意します。しかし同時に、重み付き抽出に関しては同様にシンプルな代替方法がありませんから、同じ考え方でこちらは必要と言うことも可能かとも思います。

いやいや、簡単に書けないからといって片っ端から機能追加で解決していく
わけには行かないでしょう。
あと、復元抽出なしなら Walker's method の選択肢は消えます。



n 個の母集団から m 個を復元抽出する場合の計算量をまとめておきます。

  1. 元提案の API で、線形探索で実装すると O(n * m)

  2. 元提案の API で、二分探索で実装すると O(n + m log n)

  3. 元提案の API で、Walker's method で実装すると O(m + n)

  4. [ruby-dev:42794] の API で、二分探索で実装すると O(m log n)

m << n の場合は、1 から 3 は O(n) 、4 は O(log n) 。
m >> n の場合は、どれも O(m) 。

-- 
Yusuke Endoh <mame@tsg.ne.jp>

In This Thread