Python - 将整个列表与高斯分布相结合
Python - Integrating entire list with the Gaussian distribution
我正在尝试为大于 x 的值绘制此正态分布的积分,定义为
其中
在 python
中定义两个函数
import scipy.integrate as integrate
import numpy as np
def gaussian(x, mu, sig):
norm = 1/np.sqrt(2*np.pi*sig*sig)
return norm * np.exp(-np.power(x - mu, 2.) / (2. * sig*sig))
def gaussianGreater(x, mu, sig):
Integrand = lambda x: gaussian(x, mu, sig)
return integrate.quad(Integrand,-np.Inf, x)[0]
我现在的问题在于 gaussianGreater
函数在通过分布函数求值时的积分界限。求值的时候出现这种情况。
y = gaussianGreater(subdist_1, mu_1, sig_1 )
xd = np.argsort(subdist_1)
fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111)
ax.plot(subdist_1[xd] ,y[xd] )
ValueError: The truth value of an array with more than one element
is ambiguous. Use a.any() or a.all()
我尝试将上限更改为错误给我的值,但这会 return 错误 'float' object has no attribute '__getitem__'
应用 for 循环也不起作用
[gaussianGreater(x, mu_1, sig_1 ) for x in subdist_1]
TypeError: only integer arrays with one element can be converted to an index
我该如何解决这个问题?
您定义的内容仅在 x
是单个 float
时才有效。如果你想要的是能够传递一个 numpy 数组,比如 np.array([0.2, 0.3])
并得到 [N(>0.2), N(>0.3)],那么你可以使用你已经定义的函数,只需调用 vectorize
方法。因此,如果 a
是您使用的 numpy 数组,则 a.vectorize(gaussianGreater)
将为您提供一个数组,其中每个元素都应用了 gaussianGreater
。您可以定义另一个函数 vectorGausssianGreater
,它接受一个数组,而 returns 是对其进行矢量化调用的结果。如果您真正想要的是一个可以接受数组值的函数,您可以定义如下内容:
def gaussian_greater(values, mean, standard_deviation):
def greater_float(upper_bound):
integrand = lambda y: gaussian(y, mean, standard_deviation)
return integrate.quad(integrand, -np.inf, upper_bound)[0]
return values.vectorize(greater)
可以直接使用scipy.stats.norm的生存函数求1 - F(x):
import scipy.stats as ss
x = np.linspace(-3, 3, 100)
y = ss.norm.sf(x) # you can pass its mean and std. dev. as well
plt.plot(x, y)
我正在尝试为大于 x 的值绘制此正态分布的积分,定义为
其中
在 python
中定义两个函数import scipy.integrate as integrate
import numpy as np
def gaussian(x, mu, sig):
norm = 1/np.sqrt(2*np.pi*sig*sig)
return norm * np.exp(-np.power(x - mu, 2.) / (2. * sig*sig))
def gaussianGreater(x, mu, sig):
Integrand = lambda x: gaussian(x, mu, sig)
return integrate.quad(Integrand,-np.Inf, x)[0]
我现在的问题在于 gaussianGreater
函数在通过分布函数求值时的积分界限。求值的时候出现这种情况。
y = gaussianGreater(subdist_1, mu_1, sig_1 )
xd = np.argsort(subdist_1)
fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111)
ax.plot(subdist_1[xd] ,y[xd] )
ValueError: The truth value of an array with more than one element
is ambiguous. Use a.any() or a.all()
我尝试将上限更改为错误给我的值,但这会 return 错误 'float' object has no attribute '__getitem__'
应用 for 循环也不起作用
[gaussianGreater(x, mu_1, sig_1 ) for x in subdist_1]
TypeError: only integer arrays with one element can be converted to an index
我该如何解决这个问题?
您定义的内容仅在 x
是单个 float
时才有效。如果你想要的是能够传递一个 numpy 数组,比如 np.array([0.2, 0.3])
并得到 [N(>0.2), N(>0.3)],那么你可以使用你已经定义的函数,只需调用 vectorize
方法。因此,如果 a
是您使用的 numpy 数组,则 a.vectorize(gaussianGreater)
将为您提供一个数组,其中每个元素都应用了 gaussianGreater
。您可以定义另一个函数 vectorGausssianGreater
,它接受一个数组,而 returns 是对其进行矢量化调用的结果。如果您真正想要的是一个可以接受数组值的函数,您可以定义如下内容:
def gaussian_greater(values, mean, standard_deviation):
def greater_float(upper_bound):
integrand = lambda y: gaussian(y, mean, standard_deviation)
return integrate.quad(integrand, -np.inf, upper_bound)[0]
return values.vectorize(greater)
可以直接使用scipy.stats.norm的生存函数求1 - F(x):
import scipy.stats as ss
x = np.linspace(-3, 3, 100)
y = ss.norm.sf(x) # you can pass its mean and std. dev. as well
plt.plot(x, y)