2011-12-29 14 views
5

Czy ktoś wie o alternatywę dla scipy.stats.norm.pdf()? Hostuję swoją stronę Pythona na Google App Engine, a Google nie obsługuje SciPy.Alternatywa dla scipy.stats.norm.pdf?

Próbowałem tej funkcji, ale nie takie same wyniki jak scipy:

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

Na przykład:

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) 

Zwraca następujące wartości:

0.0398942280401 
0.0398942280401 

0.0352065326764 
0.0146762663174 

0.0241970724519 
0.0146762663174 

Odpowiedz

9

Zostaliście oszukani przez arytmetyczne podziały pythonów! Oto działający kod:

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) 

Uwaga na pierwszą linię! W przeciwnym razie możesz przekonwertować każdą zmienną wejściową na zmienną, np. pomnożona przez 1.

+0

Oba rozwiązania pracował doskonale! – Leon

6

dzielenie przez 2 wewnątrz exp jest interpretowane jako liczba całkowita, gdy podział u Wynikiem jest int. Aby temu zapobiec można zapewnić, że u zawsze wynikiem jest float ręcznie rzucając go:

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 

(ja również domyślne argumenty za mu i sigma, można usunąć te, jeśli chcesz)