tensorflowでベータ分布に従う乱数を生成する
はじめに
tensorflowでベータ分布に従う乱数を生成したくなるときがあります。(mixupのときとか)
しかし、tf.random_xxxのシリーズにベータ分布は入っていません。(tf.random_gammaはあるのに。。)
それで困っている人のために記事を書きます。
実装方法の紹介とヒストグラムを書いて確認、の2本立てで行きます
実装方法
tf.distributionを使う方法
ファイナルアンサーです
import tensorflow as tf alpha = 0.2 beta = 0.2 random_beta = tf.distributions.Beta(alpha, beta).sample()
ガンマ分布に従う乱数を使用する方法
ガンマ分布に従う乱数とを用いると
という性質があるらしいです(下記リンク参考) k11i.biz
これを直接実装してもOKです。前者の方法に比べて、乱数生成アルゴリズムを明示できるのがメリットです。
しかし、ソースコードを読んだところtf.distribution.Beta.sample()内部で同じ実装を取っていたためtf1.9現在ではたぶんパフォーマンスに有意差はないです。したがって今現在この実装を取る必要はおそらくありません
import tensorflow as tf alpha = 0.2 beta = 0.2 r1 = tf.random_gamma(alpha=alpha, beta=1.0, shape=()) r2 = tf.random_gamma(alpha=beta, beta=1.0, shape=()) random_beta = r1 / (r1 + r2)
確認
ヒストグラムを書いて確認してみました。
alpha, betaともに0.2の乱数を10000回生成したヒストグラムです。
このくらい形が似てるなら安心して使えそうですね(精神論)