6

こんにちは、パレート分布でいくつかの乱数を生成したかったのです。これは numpy を使用して可能であることがわかりました。しかし、結果を形にするのは熱くわかりません。たとえば、結果の範囲を 10 ~ 20 にしたいのですが、どうすればこれを達成できますか?

numpy から pareto を使用するための構文を知っています

numpy.random.pareto(m, s)

m の意味がわかりません (ウィキペディアで調べたのですが、少しわかりません)? 生成されたタプルの si サイズを知っています。

4

3 に答える 3

13

ドキュメントには、混乱を招く可能性のある間違いがあるようです。

通常、コール シグネチャのパラメータ名は次のとおりです。

numpy.random.pareto(a, size=None)

指定された詳細とパラメーター名を一致させます。

Parameters
----------
shape : float, > 0.
    Shape of the distribution.
size : tuple of ints
    Output shape.  If the given shape is, e.g., ``(m, n, k)``, then
    ``m * n * k`` samples are drawn.

aしかし、最初のパラメーターは両方と呼ばれていることがわかりますshape目的の形状を関数の最初の引数として渡して、数値の分布を取得しsizeます (それらはtupleではなく numpyarrayです)。

2 番目のパラメーター (ウィキペディアでは x mと呼ばれる) を変更する必要がある場合は、ドキュメントの例のように、すべての値に追加するだけです。

Examples
--------
Draw samples from the distribution:

>>> a, m = 3., 1. # shape and mode
>>> s = np.random.pareto(a, 1000) + m

したがって、下限を実装するのは簡単です: に下限を使用するだけですm:

lower = 10  # the lower bound for your values
shape = 1   # the distribution shape parameter, also known as `a` or `alpha`
size = 1000 # the size of your sample (number of random values)

下限のある分布を作成します。

x = np.random.pareto(shape, size) + lower

ただし、パレート分布は上からの境界ではないので、切り捨てようとすると本当に切り捨てられた分布になってしまい、まったく同じものではないので注意が必要です。形状パラメーターが 1 よりはるかに大きい場合、分布は x – (a+1)のように代数的に減衰するため、大きな値はそれほど多くありません。

上限を実装することを選択した場合、簡単な方法は、通常のサンプルを生成してから、制限を超える値を削除することです。

upper = 20
x = x[x<upper]  # only values where x < upper

しかし、サンプルのサイズは (おそらく) 小さくなっています。必要なサイズになるまで、新しい値を追加し続ける (そして大きすぎる値を除外する) こともできますが、最初に十分な大きさにしてからsize、それらのみを使用する方が簡単です。

x = np.random.pareto(shape, size*5/4) + lower
x = x[x<upper][:size]
于 2013-10-22T19:58:17.413 に答える
1

@askewchan ドキュメントは変更されていますか?

最新のドキュメントによると、mこのように使用する必要があります

a, m = 3., 2.  # shape and mode
s = (np.random.pareto(a) + 1) * m

ここaで は形状、mは縮尺 (ウィキペディアでは (x m ) です) です。

これはテスト コードで、期待される平均値はシミュレーション結果に等しくなります。

a = 2
m = 10

def subtask_service_time():
    return (numpy.random.pareto(a) + 1) * m

print('Simulation mean:', sum([subtask_service_time() for _ in range(1000)]) / 1000)
print('Excepted mean:', a * m / (a - 1))

>>>>Simulation mean: 20.383399962437686
>>>>Excepted mean: 20.0
于 2016-05-16T10:16:01.280 に答える