機械学習タスク。バウンド付きのランダムなw.r.t正規分布のグループを取得する必要があります。 np.random.normal()
を使用して正規分布番号を取得できますが、バインドされたパラメーターは提供しません。私はそれを行う方法を知りたいですか?
truncnorm
のパラメーター化は複雑です。そこで、パラメーター化をより直感的なものに変換する関数を以下に示します。
from scipy.stats import truncnorm
def get_truncated_normal(mean=0, sd=1, low=0, upp=10):
return truncnorm(
(low - mean) / sd, (upp - mean) / sd, loc=mean, scale=sd)
パラメーターを使用してジェネレーターをインスタンス化します:mean、標準偏差、および切り捨て範囲:
>>> X = get_truncated_normal(mean=8, sd=2, low=1, upp=10)
次に、Xを使用して値を生成できます。
>>> X.rvs()
6.0491227353928894
または、生成されたN個の値を持つnumpy配列:
>>> X.rvs(10)
array([ 7.70231607, 6.7005871 , 7.15203887, 6.06768994, 7.25153472,
5.41384242, 7.75200702, 5.5725888 , 7.38512757, 7.47567455])
これは、3つの異なる切り捨てられた正規分布のプロットです。
X1 = get_truncated_normal(mean=2, sd=1, low=1, upp=10)
X2 = get_truncated_normal(mean=5.5, sd=1, low=1, upp=10)
X3 = get_truncated_normal(mean=8, sd=1, low=1, upp=10)
import matplotlib.pyplot as plt
fig, ax = plt.subplots(3, sharex=True)
ax[0].hist(X1.rvs(10000), normed=True)
ax[1].hist(X2.rvs(10000), normed=True)
ax[2].hist(X3.rvs(10000), normed=True)
plt.show()
切り捨てられた正規分布 を探している場合、SciPyには truncnorm
という関数があります
この分布の標準形式は、範囲[a、b]に切り捨てられた標準正規です。aとbは標準正規の領域で定義されていることに注意してください。特定の平均値と標準偏差のクリップ値を変換するには、次を使用します。
a、b =(myclip_a-my_mean)/ my_std、(myclip_b-my_mean)/ my_std
truncnormは形状パラメーターとしてaとbを取ります。
_>>> from scipy.stats import truncnorm
>>> truncnorm(a=-2/3., b=2/3., scale=3).rvs(size=10)
array([-1.83136675, 0.77599978, -0.01276925, 1.87043384, 1.25024188,
0.59336279, -0.39343176, 1.9449987 , -1.97674358, -0.31944247])
_
上記の例は-2と2で区切られ、10個のランダム変量を返します(.rvs()
メソッドを使用)
_>>> min(truncnorm(a=-2/3., b=2/3., scale=3).rvs(size=10000))
-1.9996074381484044
>>> max(truncnorm(a=-2/3., b=2/3., scale=3).rvs(size=10000))
1.9998486576228549
_
-6、6のヒストグラムプロットは次のとおりです。
@bakkalの提案(+1)に加えて、これを達成するための Vincent Mazet レシピも調べて、 py-rtnorm module by Christoph Lassner .