scipy.stat.norm.pdf не добавляет ни одного - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь вычислить интеграл гауссиана от произвольной точки гаммы следующим образом:

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

Синяя область интегрирована , но добавляет больше одного (гораздо больше), даже если она не завершена.

Я обнаружил это связано, но не помогло.

Почему оно складывает более одного?

1 Ответ

0 голосов
/ 09 октября 2018

Как говорит @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 !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...