[#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:42805] Re: [Ruby 1.9-Feature#4147][Assigned] Array#sample で重みを指定したい

From: Yusuke ENDOH <mame@...>
Date: 2010-12-19 11:12:01 UTC
List: ruby-dev #42805
遠藤です。

2010年12月19日14:06 Masaya TARUI <[email protected]>:
> #3647が入らなかったとして、仕様を考えると大体3通りがあると思います。
> 1)重みを与えた時は復元抽出にする。
> 2)取り出されたアイテムの重みを-1する。 (-1以外もあるかもしれませんが)
> 3)重みと複数個抽出両方与えられたらエラーにする。
>
> と挙げてみたもののどれも今一な仕様に思えます。


4) 取り出されたアイテムの重みを 0 にする (もう取り出さない)

も考えられます。

いくつか関連調査してみました。


○ R
http://stat.ethz.ch/R-manual/R-devel/library/base/html/sample.html

  sample(母集団, 取り出す個数, replace かどうか = false, 重み = nil)

非復元抽出で重みが指定された場合は、取り出されたアイテムの重み
は無視して残りの重みだけで次を取り出す (つまり 4 に相当) 。


○ Matlab
http://www.mathworks.com/help/toolbox/stats/randsample.html

  randsample(母集団, 取り出す個数, replace かどうか = false, 重み = nil)

非復元抽出で重みが指定された場合はサポートされていない (つまり
3 に相当) 。


○ Mathematica
http://reference.wolfram.com/mathematica/ref/RandomSample.html
http://reference.wolfram.com/mathematica/ref/RandomChoice.html

  RandomSample[母集団, 取り出す個数]
  RandomSample[重み->母集団, 取り出す個数]
  RandomChoice[母集団, 取り出す個数]
  RandomChoice[重み->母集団, 取り出す個数]

非復元抽出が RandomSample 、復元抽出が RandomChoice 。
-> の文法の意味は知りません。

非復元抽出で重みが指定された場合の意味は説明されていないけれど、
サンプルを見る感じでは 4 っぽい。

ちょっと面白いのは、個数の引数を省略した場合、RandomSample は
母集団のサイズを指定されたものとみなし (つまり Ruby の shuffle
相当) 、RandomChoice は 1 を指定されたものとみなす (Ruby の
sample 相当) そうです。Ruby ではわかりにくいとされそうですが。


○ Python
http://docs.python.org/library/random.html

  choice(母集団)   # 1 つ取り出す
  shuffle(母集団)
  sample(母集団, 取り出す個数)

復元抽出も重み指定もなさそう。(?)


どれもマニュアルを読んでるだけなので、正確さは期待しないでくだ
さい。


でも、重みを累積分布として与える例はないですねえ。
sample ごときで常に O(n) かかってほしくないと思うのですが。
あと、浮動小数で重みを与えたとき、下手に sum を自前で計算すると
誤差が蓄積しそうなのもちょっとだけ気になってます。

-- 
Yusuke Endoh <[email protected]>

In This Thread