Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有可变上界的Python二元正规CDF_Python_Normal Distribution_Cdf - Fatal编程技术网

具有可变上界的Python二元正规CDF

具有可变上界的Python二元正规CDF,python,normal-distribution,cdf,Python,Normal Distribution,Cdf,我试图找到一种优雅的方法,用python计算二元正态CDF,其中CDF的一个上界是两个变量的函数,其中一个是二元正态密度的变量(积分变量) 例如: from scipy import integrate import numpy as np # First define f(x, y) as the bivariate normal distribution with fixed correlation p p = 0.4 def f(x, y): Q = x**2 + y**2 -

我试图找到一种优雅的方法,用python计算二元正态CDF,其中CDF的一个上界是两个变量的函数,其中一个是二元正态密度的变量(积分变量)

例如:

from scipy import integrate
import numpy as np

# First define f(x, y) as the bivariate normal distribution with fixed correlation p
p = 0.4
def f(x, y):
    Q = x**2 + y**2 - 2*p*x*y
    return 1/(2*np.pi*np.sqrt(1-p**2))*np.exp(-1/(2*(1-p**2))*Q)

# Define N2(a, b) as the cumulative bivariate normal distribution f where a is constant 
# and b is a function of two variables
def N2(a, b):
    prob, error = integrate.dblquad(f, np.NINF, a, lambda x: np.NINF, b)
    return prob

# Upper bound function of 2 variables example where x is an integral variable
def upper_bound(x, v):
    return 0.5*v*x

# My approach which doesn't work
# Calculate bivariate normal CDF for different values of v in the upper bound
results = [N2(1, upper_bound(x, v)) for v in np.linspace(0.01, 4, 200)]
关于如何改变我的方法,以便在中调用
上限(x,v)
有什么想法吗
results=[N2(1,上界(x,v)),在np.linspace(0.01,4200)]
会起作用吗?解决这一问题的其他办法也值得欢迎

编辑:这是我要计算的积分,其中f(x,y)是二元正态密度函数。注意,我要计算的实际上界f(x,v)=0.5*v*x要复杂得多,这只是一个例子,因此我不想用符号来计算它,例如用sympy。另外,我的目标是计算几百个不同v值的积分


积分:

尽管速度很慢,但这种方法似乎有效

前几行,直到“this should production 1”,是一个健全性检查。我想验证我的方法是否能够正确计算密度下的体积。是的

我使用方差-协方差矩阵来获得所需的相关性0.4,并避免编写自己的pdf

我在两个地方使用curry函数,这样函数就只有一个参数。这使得计算作为x函数的内积分成为可能。它还可以使v参数“超出”其他计算

from toolz import curry
from scipy.stats import multivariate_normal
from scipy.integrate import quad
import numpy as np

@curry
def bivariate(x,y):
    return multivariate_normal.pdf([x,y],cov=[[1,.4],[.4,1]])

def out_y(x):
    marginal = bivariate(x)
    return quad(marginal, np.NINF, np.PINF)[0]

# this should produce 1
print (quad(out_y, np.NINF, np.PINF)[0])

# now to what the OP wants

@curry
def inner_integral(v,x):
    marginal = bivariate(x)
    return quad(marginal, np.NINF, 0.5*v*x)[0]

inner_integral_for_one_v = inner_integral(0.8)
print (quad(inner_integral_for_one_v,np.NINF, 1)[0])
要使用此代码,您需要编写与以下内容等效的内容:

for v in range(0,1,0.1):
    inner_integral_for_one_v = inner_integral(v)
    print (quad(inner_integral_for_one_v,np.NINF, 1)[0])

我很难理解这一点。你会考虑用传统的数学符号来计算你想要计算的吗?你可以在你的问题中把它显示为一个图像。@BillBell我添加了一张积分的图片,谢谢你的建议。