3

0 から 100 までの値を含む (numpy) 配列を生成する最良の方法を教えてください。これは、(たとえば) 平均 50 と分散 5 の正規分布関数によって重み付けされます。 (ほとんどない)ゼロと百。問題を解決するのはそれほど難しくないと思いますが、どういうわけか立ち往生しています...

np.linspace で何かを考えましたが、重みオプションがないようです。

明確にするために: 私は 0 から 100 までの単純な正規分布ではなく、0 から 100 までの配列のようなもので、中央の値の密度が高いものを望んでいます。

ありがとう

4

3 に答える 3

4

scipy の統計分布を使用できます。

import numpy as np
from scipy import stats

# your distribution:
distribution = stats.norm(loc=50, scale=5)

# percentile point, the range for the inverse cumulative distribution function:
bounds_for_range = distribution.cdf([0, 100])

# Linspace for the inverse cdf:
pp = np.linspace(*bounds_for_range, num=1000)

x = distribution.ppf(pp)

# And just to check that it makes sense you can try:
from matplotlib import pyplot as plt
plt.hist(x)
plt.show()

もちろん、行き来するときの数値の不正確さのために、開始点と終了点がこのように正確ではないことは認めます。

于 2013-02-24T12:28:21.407 に答える
2

一般に、有限の離散サンプルは分布を正確に再現できないため、問題が正確に解決できるわけではないことを理解することが重要です。

これは、[0,1] の 3 つの値のセットが均等に分布しているような質問の単純なバージョンを尋ねると、簡単に確認できます。ここで、結果 [0,0,1] と [0,1,1] はどちらも妥当です。

ただし、大まかに問題を解決することはできます。指定された確率が正規化さcountれた場所から要素を含む配列を要求した場合( )、結果の配列内の要素の数は理論的には次のようになります。[0,1,...,N]p=[p0,p1,...,pN]p0+...+pN==1c_kk

c[k] = p[k]*count

しかし、これらのカウントはフロートになりました。合計を維持しながら、それらを「丸める」方法を決定する必要があります。これは、質問の定義が不十分であることから生じる選択の自由です。

于 2013-02-25T10:03:19.007 に答える
-1
>>> sorted([int(random.gauss(50,5)) for i in range(100)])
[33, 40, 40, 40, 40, 40, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 56, 56, 57, 57, 57, 57, 57, 57, 57, 58, 61]
于 2013-03-02T19:29:54.710 に答える