web-dev-qa-db-ja.com

numpyの範囲内で正規分布を取得する方法は?

機械学習タスク。バウンド付きのランダムなw.r.t正規分布のグループを取得する必要があります。 np.random.normal()を使用して正規分布番号を取得できますが、バインドされたパラメーターは提供しません。私はそれを行う方法を知りたいですか?

26
maple

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)


それの使い方?

  1. パラメーターを使用してジェネレーターをインスタンス化します:mean標準偏差、および切り捨て範囲

    >>> X = get_truncated_normal(mean=8, sd=2, low=1, upp=10)
    
  2. 次に、Xを使用して値を生成できます。

    >>> X.rvs()
    6.0491227353928894
    
  3. または、生成された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()

enter image description here

37
toto_tico

切り捨てられた正規分布 を探している場合、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のヒストグラムプロットは次のとおりです。

enter image description here

12
bakkal

@bakkalの提案(+1)に加えて、これを達成するための Vincent Mazet レシピも調べて、 py-rtnorm module by Christoph Lassner .

1
armatita