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

Python:如何定义定制发行版?,python,distribution,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 +

我想创建一个基于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=0
r=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
随机距离的直方图呢?

使用您的最小示例(稍微调整):

要从随机变量中采样,请使用类中的方法:

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

注:随着
N
的缓慢增加,计算时间急剧增加

要绘制直方图,请使用
matplotlib
库,请参见:

下面是一个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)
它导致:


为什么你期望
和(我的简历cdf(x))
是一元的?正是PDF下的面积是单位的,您的计算与分布面积无关。我希望相对频率之和为
1
PDF的面积必须为1,但其大小可以超过1。这方面的一个例子是[0,1]范围内的三角形分布。由于三角形的面积为
底*高/2
,底长度为1时,模式下的高度必须为2。采样pdf值的未加权总和将明显超过1。@jlandercy@pjs这是有道理的。我对标准化分布感到困惑。有没有办法根据我定义的分布定义一个
N=2000000
随机距离的直方图?
N = 50000
X = my_cv.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)
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)