【问题标题】:scipy.stat.norm.pdf does not add up to onescipy.stats.norm.pdf 加起来不等于一
【发布时间】:2018-10-09 12:36:30
【问题描述】:

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

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

蓝色区域是集成的,但它增加了不止一个(更多),即使它不是完整的功能。

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

为什么加起来不止一个?

【问题讨论】:

  • 您的积分近似值不正确。每个被求和的项必须乘以dx,即x 样本的间距。试试area = y[x>=gamma].sum()*(x[1] - x[0])
  • 谢谢! suach 一个新的错误 xD 我修复了它并发布为完整性的答案

标签: python numpy scipy


【解决方案1】:

正如@Warren Weckesser 所说,问题在于我没有考虑 dx 项(intergal 的基本尺寸)

幸运的是,这很容易解决,所以为了完整起见,就这样吧……

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

图片是

非常感谢@Warren Weckesser!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    相关资源
    最近更新 更多