Numpy 计算条件概率分布的累积分布

Numpy 计算条件概率分布的累积分布,numpy,statistics,scipy,bayesian,Numpy,Statistics,Scipy,Bayesian,对于给定的m,pz | m,我有一个条件概率z,其中系数的选择是为了使z上极限为[0,1.5]的积分和范围为[18:28]的m等于1 def p(z,m): if (m<21.25): E = { 'ft':0.55, 'alpha': 2.99, 'z0':0.191, 'km':0.089, 'kt':0.25 } S = { 'ft':0.39, 'alpha': 2.15, 'z0':0.121, 'km':0.093, 'kt':-0.

对于给定的m,pz | m,我有一个条件概率z,其中系数的选择是为了使z上极限为[0,1.5]的积分和范围为[18:28]的m等于1

def p(z,m):  
    if (m<21.25):
        E = { 'ft':0.55, 'alpha': 2.99, 'z0':0.191, 'km':0.089, 'kt':0.25 }
        S = { 'ft':0.39, 'alpha': 2.15, 'z0':0.121, 'km':0.093, 'kt':-0.175 }
        I={ 'ft':0.06, 'alpha': 1.77, 'z0':0.045, 'km':0.096, 'kt':-0.9196 }
        Evalue=E['ft']*np.exp(-1*E['kt']*(m-18))*z**E['alpha']*np.exp(-1*(z/(E['z0']+E['km']*(m-18)))**E['alpha'])
        Svalue=S['ft']*np.exp(-1*S['kt']*(m-18))*z**S['alpha']*np.exp(-1*(z/(S['z0']+S['km']*(m-18)))**S['alpha'])
        Ivalue=I['ft']*np.exp(-1*I['kt']*(m-18))*z**I['alpha']*np.exp(-1*(z/(I['z0']+I['km']*(m-18)))**I['alpha'])
        value=Evalue+Svalue+Ivalue
    elif(m>=21.25):
        E = { 'ft':0.25, 'alpha': 1.957, 'z0':0.321, 'km':0.196, 'kt':0.565 }
        S = { 'ft':0.61, 'alpha': 1.598, 'z0':0.291, 'km':0.167, 'kt':0.155 }
        I = { 'ft':0.14, 'alpha': 0.964, 'z0':0.170, 'km':0.129, 'kt':0.1759 }
        Evalue=E['ft']*np.exp(-1*E['kt']*(m-18))*z**E['alpha']*np.exp(-1*(z/(E['z0']+E['km']*(m-18)))**E['alpha'])
        Svalue=S['ft']*np.exp(-1*S['kt']*(m-18))*z**S['alpha']*np.exp(-1*(z/(S['z0']+S['km']*(m-18)))**S['alpha'])
        Ivalue=I['ft']*np.exp(-1*I['kt']*(m-18))*z**I['alpha']*np.exp(-1*(z/(I['z0']+I['km']*(m-18)))**I['alpha'])
        value=Evalue+Svalue+Ivalue
    return value
哪种假设可能导致这种不一致,或者我计算错误

更新:累积分布cdf_zgm如下所示

在其他情况下,为了得到概率的倒数,我使用了以下方法:

# fix bounds of cdf_zgm
cdf_zgm[:, 0] = 0
cdf_zgm[:, -1] = 1
#Interpolate the data using a linear spline to "grid_q" samples
grid_q = np.linspace(0, 1, 200)
grid_qm = np.empty((len(grid_m), len(grid_q)), float)
for i in range(len(grid_m)):
    grid_qm[i] = interpolate.interp1d(cdf_zgm[i], grid_z)(grid_q)

# build 2d interpolation for z as function of (q,m)
z_interp = interpolate.interp2d(grid_q, grid_m, grid_qm)
#sample magnitude 
ng=20000
r = dist_m.rvs(ng)
rvs_u = np.random.rand(ng)
rvs_z = np.asarray([z_interp(rvs_u[i], r[i]) for i in range(len(rvs_u))]).ravel()

将CDF的边界固定为1是正确的方法吗?

我不知道该代码有什么问题。但这里有几个不同的想法可以尝试:

1只需对数组元素求和,而不是试图计算数值积分。那样更简单。对数组元素求和本质上是计算矩形规则近似值,事实证明,它实际上比梯形规则更精确


2不要试图一次创建一个完整的二维数组,而是编写一个函数,只为给定的m值创建一个pz | m的一维切片。然后将这些元素相加,得到累积概率。

我实现了你的评论,结果与integrate.cumtrapz类似。我不明白如果m和z参数的概率积分都是1,为什么m方向的累积分布会是1,而z方向不是1?!!这是否与条件概率的定义相矛盾?@Dalek我已经执行了你上面展示的代码,我看到了,嗯。。。我再试一次@Dalek我已经执行了你上面展示的代码,我看到sum-sum prob_zgm*dx*dy,其中dx和dy是每个方向上的网格宽度,也就是说,步长范围/步数产生一个非常接近1的数字,这表示函数p是一个联合概率密度,而不是条件密度。因此,要获得条件密度,只需从中提取一个切片,即一行或一列,并对该切片进行规格化,使SUMSICE*a*b,其中b是沿切片的步长,因此b是dx或dy,a是规格化因子。一旦获得条件密度,就可以形成累积和,而不用担心trapz。
# fix bounds of cdf_zgm
cdf_zgm[:, 0] = 0
cdf_zgm[:, -1] = 1
#Interpolate the data using a linear spline to "grid_q" samples
grid_q = np.linspace(0, 1, 200)
grid_qm = np.empty((len(grid_m), len(grid_q)), float)
for i in range(len(grid_m)):
    grid_qm[i] = interpolate.interp1d(cdf_zgm[i], grid_z)(grid_q)

# build 2d interpolation for z as function of (q,m)
z_interp = interpolate.interp2d(grid_q, grid_m, grid_qm)
#sample magnitude 
ng=20000
r = dist_m.rvs(ng)
rvs_u = np.random.rand(ng)
rvs_z = np.asarray([z_interp(rvs_u[i], r[i]) for i in range(len(rvs_u))]).ravel()