Альтернатива для scipy.stats.norm.pdf? - PullRequest
5 голосов
/ 29 декабря 2011

Кто-нибудь знает альтернативу scipy.stats.norm.pdf ()?Я размещаю свой сайт на Python в Google App Engine, и Google не поддерживает SciPy.

Я пробовал эту функцию, но она не давала таких же результатов, как scipy:

def normpdf(x, mu, sigma):
    u = (x-mu)/abs(sigma)
    y = (1/(sqrt(2*pi)*abs(sigma)))*exp(-u*u/2)
    return y

Например:

print scipy.stats.norm.pdf(20, 20, 10)
print normpdf(20, 20, 10)

print scipy.stats.norm.pdf(15, 20, 10)
print normpdf(15, 20, 10)

print scipy.stats.norm.pdf(10, 20, 10)
print normpdf(10, 20, 10)

Возвращает эти значения:

0.0398942280401
0.0398942280401

0.0352065326764
0.0146762663174

0.0241970724519
0.0146762663174

Ответы [ 2 ]

9 голосов
/ 29 декабря 2011

Вас обманула арифметика с целочисленным делением питонов! Вот некоторый рабочий код:

from __future__ import division

import scipy.stats
from numpy import *

def normpdf(x, mu, sigma):
    u = (x-mu)/abs(sigma)
    y = (1/(sqrt(2*pi)*abs(sigma)))*exp(-u*u/2)
    return y


print scipy.stats.norm.pdf(20, 20, 10)
print normpdf(20, 20, 10)

print scipy.stats.norm.pdf(15, 20, 10)
print normpdf(15, 20, 10)

print scipy.stats.norm.pdf(10, 20, 10)
print normpdf(10, 20, 10)

Обратите внимание на первую строку! В противном случае вы можете преобразовать каждую входную переменную в число с плавающей точкой, например умножением на 1.

6 голосов
/ 29 декабря 2011

Деление на 2 внутри exp интерпретируется как целочисленное деление всякий раз, когда u оценивается как int. Чтобы предотвратить это, вы можете убедиться, что u всегда оценивается как float, вручную приведя его:

def normpdf(x, mu=0, sigma=1):
    u = float((x-mu) / abs(sigma))
    y = exp(-u*u/2) / (sqrt(2*pi) * abs(sigma))
    return y

(я также предоставил параметры по умолчанию для mu и sigma, вы можете удалить их, если хотите)

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