scipy.stat.norm.pdf总计不等于一个

时间:2018-10-09 04:11:26

标签: python numpy scipy

我正尝试从任意点伽玛计算高斯积分,如下所示:

import numpy as np
from scipy.stats import norm

def func(mu, sigma, gamma):
    x = np.linspace(mu-4*sigma, mu + 4*sigma, 100)
    y = norm.pdf(x, mu, sigma)

    area = y[x>=gamma].sum()

    print(f"Area is ~ {area:.3f}")

    plt.plot(x,y, label=f'μ0 = {mu}, σ={sigma}')
    plt.fill_between(x[x>gamma],y[x>gamma], alpha=.5, label=f'area={area:.3f}')
    plt.title("Example")
    plt.legend(loc='best')
    plt.show()

# Execute the function
func(0,10,-20)

输出为:     面积约为1.211

with this image

蓝色区域是集成的,但是即使它不是完整的功能,也可以添加一个以上(更多)。

我发现this相关,但没有帮助。

为什么加起来不止一个?

1 个答案:

答案 0 :(得分:0)

就像@Warren Weckesser所说的那样,问题在于我没有考虑dx项(合计的基本大小)

幸运的是,这很容易解决,因此为了完整起见,它就来了...

import numpy as np
from scipy.stats import norm

def func(mu, sigma, gamma):
    # Notice the retstep=True param, it will return the dx needed
    x, dx = np.linspace(mu-4*sigma, mu + 4*sigma, 100, retstep=True)
    y = norm.pdf(x, mu, sigma)

    # multiply all with dx
    area = y[x>=gamma].sum() * dx

    print(f"Area is ~ {area:.3f}")

    plt.plot(x,y, label=f'μ0 = {mu}, σ={sigma}')
    plt.fill_between(x[x>gamma],y[x>gamma], alpha=.5, label=f'area={area:.3f}')
    plt.title("Example")
    plt.legend(loc='best')
    plt.show()

func(0,10,-20)

现在输出有意义,它是Area is ~ 0.978

图像是

corrected graph

非常感谢@Warren Weckesser !!