2011-12-29 95 views
5

有没有人知道scipy.stats.norm.pdf()的替代方案?我在Google App Engine上托管我的Python网站,而Google不支持SciPy。scipy.stats.norm.pdf的替代方案?

我试过这个功能,但是这并没有为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 

回答

9

你受到蟒蛇整数除法算术的欺骗!以下是一些工作代码:

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) 

注意第一行!否则,你可以将每个输入变量转换为浮点数,例如通过2内的exp1.

+0

两种解决方案合作完美! – Leon 2011-12-29 15:05:43

6

划分乘以被解释为整数除法每当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 

(我公司还提供缺省参数musigma,你可以删除这些,如果你想)