2011-12-29 25 views
5

¿Alguien sabe de una alternativa para scipy.stats.norm.pdf()? Estoy alojando mi sitio python en Google App Engine y Google no es compatible con SciPy.alternativa para scipy.stats.norm.pdf?

He tratado de esta función, pero que no regresaba los mismos resultados que scipy:

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

Por ejemplo:

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) 

devuelve estos valores:

0.0398942280401 
0.0398942280401 

0.0352065326764 
0.0146762663174 

0.0241970724519 
0.0146762663174 

Respuesta

9

¡Te engañaron las pitonisas de aritmética de división entera! Aquí hay algunos códigos de trabajo:

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) 

¡Observe la primera línea! De lo contrario, podría convertir cada variable de entrada en un flotante, p. multiplicando por 1.

+0

Ambas soluciones elaboradas ¡perfectamente! – Leon

6

La división por 2 en el interior de la exp se interpreta como la división entera siempre que u evalúa a un int. Para evitar esto se puede asegurar que u da siempre como resultado un float echando manualmente:

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 

(también he proporcionado argumentos predeterminados para mu y sigma, usted podría quitar los si quería)