From: Yusuke ENDOH Date: 2010-12-19T20:12:01+09:00 Subject: [ruby-dev:42805] Re: [Ruby 1.9-Feature#4147][Assigned] Array#sample で重みを指定したい 遠藤です。 2010年12月19日14:06 Masaya TARUI : > #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