亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 numpy.random.choice 不使用算術編碼?

為什么 numpy.random.choice 不使用算術編碼?

素胚勾勒不出你 2023-04-18 16:28:57
如果我評估類似的東西:numpy.random.choice(2, size=100000, p=[0.01, 0.99])使用一個均勻分布的 random float,比如說r,并決定是否r < 0.01可能會浪費許多生成的隨機位(熵)。我聽說(二手)生成偽隨機數在計算上很昂貴,所以我假設不會這樣做numpy,而是在這種情況下使用像算術編碼這樣的方案。然而,乍一看似乎確實為每個被要求的樣本choice生成了一個。float此外,一項快速timeit實驗表明,生成n統一的浮點數實際上比n來自p=[0.01, 0.99].>>> timeit.timeit(lambda : numpy.random.choice(2, size=100000, p=[0.01, 0.99]), number=1000)1.74494537999999>>> timeit.timeit(lambda : numpy.random.random(size=100000), number=1000)0.8165735180009506真的會為每個樣本choice生成一個嗎?float在某些情況下使用某種壓縮算法是否不會顯著提高性能(特別是如果size它很大且p分布不均勻)?如果不是,為什么不呢?
查看完整描述

1 回答

?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

從 NumPy 1.17 開始,原因主要是向后兼容性。

從 NumPy 1.17 開始,numpy.random.*函數(包括 )是遺留函數,根據NumPy 的新 RNG 政策numpy.random.choice,“應保持與當前相同”,該政策還為 NumPy 引入了新的隨機生成系統。使它們成為遺留功能的原因包括避免全局狀態的建議。盡管如此,NumPy 并沒有在 1.17 版中棄用任何函數,盡管 NumPy 的未來版本可能會棄用。numpy.random.*

回想一下,在您的示例中,numpy.random.choice將 s 數組作為float權重。整數權重數組將導致更精確的隨機數生成。盡管 anyfloat可以轉換為有理數(導致有理值權重,從而導致整數權重),但遺留的 NumPy 版本似乎不會這樣做。numpy.random.choice在不破壞向后兼容性的情況下,無法更改這些和其他實現決策。

順便說一下,算術編碼并不是唯一一種旨在避免比特浪費的算法。也許用于離散分布采樣的規范算法是 Knuth 和 Yao 算法(1976),它根據所涉及概率的二元展開精確地選擇一個隨機整數,并將問題視為二叉樹上的隨機游走。(該算法平均使用距理論下限最多 2 位的距離。)任何其他整數生成算法最終都可以用相同的方式描述,即二叉樹上的隨機游走。例如,快速加載的骰子滾筒是最近的一種算法,它對其使用的平均位數有一個保證范圍(在這種情況下,與理論下限相差不超過 6 位)。Han 和 Hoshi 算法(從 1997 年開始)是另一種算法,但使用累積概率。


查看完整回答
反對 回復 2023-04-18
  • 1 回答
  • 0 關注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號