Python对数正态密度与分析解决方案不同

时间:2017-04-19 13:10:02

标签: python scipy

我一直在测试python中的一些函数(以确保我理解函数)并且我很困惑,因为我有不同的结果。

我正在测试stats.lognorm.pdf表单scipy。此函数应在以下代码中使用x,shape, scale, loc = 0返回相同的结果:

val1 = (1/(x*shape*math.sqrt(2*math.pi)))*math.exp(-((math.log(x)-math.log(scale)**2)/(2*math.pow(shape,2))))
val2 = stats.lognorm.pdf(x, shape, 0, scale)    #I expect that val1 == val2

当我尝试使用一些精细数字时它看起来很好。

x = 1

scale = 1 #log(shape) = u => u=0 
shape = 0.25

然后

val1 = 1.5957691216057308

val2 = 1.59576912161

但是当我设置

shape = 0.8
scale = 25.16
x = 23

结果差异很大

val1 = 6.33367993244142
val2 = 0.0215455972263

为什么会这样?我的代码有问题吗?

2 个答案:

答案 0 :(得分:1)

你的val1错了,你的指数里面有**2,而不是在括号内。如果你试试这个:

val1 = (1 / (x * shape * math.sqrt(2 * math.pi))) * math.exp(
      -(math.log(x) - math.log(scale))**2 / (2 * math.pow(shape, 2)))

一切都应该按预期工作。

这里可能有一个教训可以学习为什么PEP8坚持正确格式化和间隔代码,因为这样可以更容易地发现错误。

答案 1 :(得分:1)

我认为你误读了文档

qsub

如果我们按照以下步骤操作:

The probability density function for lognorm is:

lognorm.pdf(x, s) = 1 / (s*x*sqrt(2*pi)) * exp(-1/2*(log(x)/s)**2)

for x > 0, s > 0.

lognorm takes s as a shape parameter.

The probability density above is defined in the “standardized” form. To
shift and/or scale the distribution use the loc and scale parameters. 
Specifically, lognorm.pdf(x, s, loc, scale) is identically equivalent to 
lognorm.pdf(y, s) / scale with y = (x - loc) / scale.

给出:

x = 23.
shape = 0.8
scale = 25.16
loc = 0.


xp = (x - loc) / scale
val1 = 1. / (shape*xp*math.sqrt(2.*math.pi)) * math.exp(-1./2.*(math.log(xp)/shape)**2)
val1 = (val1) / scale

print(val1)
val2 = stats.lognorm.pdf(x, shape, 0, scale)    #I expect that val1 == val2
print(val2)