Python:如何定义自定义发行版?

时间:2017-09-05 13:03:08

标签: python distribution

我想根据Levy截断法创建一个自定义发行版,其中包含

p(r) = (r + r0)**(-beta)*exp(-r/k)

所以我用以下方式定义它:

import numpy as np
import scipy.stats as st

class LevyPDF(st.rv_continuous):
    def _pdf(self,r):
        r0 = 100
        k = 1500
        beta = 1.6
        return (r + r0)**(-beta)*np.exp(-r/k)

假设我想找到r = 0r = 50km之间的距离分布。然后:

nmin = 0
nmax = 50
my_cv = LevyPDF(a=nmin, b=nmax, name='LevyPDF')
x = np.linspace(nmin, nmax, (nmax-nmin)*2)

我不明白为什么:

sum(my_cv.cdf(x)) = 2.22

而不是1

那么如何根据我定义的分布定义N = 2000000随机距离的直方图?

1 个答案:

答案 0 :(得分:1)

使用您的最小示例(略微适应):

import scipy.stats as st
import numpy as np
import matplotlib.pyplot as plt

class LevyPDF(st.rv_continuous):
    def _pdf(self,r):
        r0 = 100
        k = 1500
        beta = 1.6
        return (r + r0)**(-beta)*np.exp(-r/k)

nmin = 0
nmax = 50
my_cv = LevyPDF(a=nmin, b=nmax, name='LevyPDF')

要从随机变量中进行采样,请使用rvs() class:

中的rv_continuous方法
N = 50000
X = my_cv.rvs(size=N, random_state=1)

将返回一个大小为(N,)的数组,其中包含从您的分布中采样的随机变量。使用random_state选项冻结您的示例并使您的脚本可重复(它为您的采样定义随机种子)。

注意N轻微增加,计算时间急剧增加。

要绘制直方图,请使用matplotlib库,请参阅hist

fig, axe = plt.subplots()
n, bins, patches = axe.hist(X, 50, normed=1, facecolor='green', alpha=0.75)
plt.show(axe)

Bellow从Chi Square获得40度自由采样的例子:

from scipy import stats
import numpy as np
import matplotlib.pyplot as plt
rv = stats.chi2(40)
N = 200000
X = rv.rvs(size=N, random_state=1)
fig, axe = plt.subplots()
n, bins, patches = axe.hist(X, 50, normed=1, facecolor='green', alpha=0.75)
plt.show(axe)

导致:

Chi2Sample