首先,loc不是简单的线性移位分布,事实上loc有自己的统计意义,它意味着样本减去loc后会得到一个标准化的对数正态分布,其下限为零,这一点相当重要。
因此,当您指定“loc”或“floc”时,实际上您施加了一个非常强的催眠,即您假设这些样本有一个下限,而下限“恰好”是“loc”值。因此,scipy使用了不同的算法进行拟合,即:
如果您提供了loc信息,那么scipy将采用最大似然法来计算拟合参数,如果没有,它将使用数值求解器。
此外,您还可以阅读代码:
在scipy package stats/u continuous distns.py中
电话:3889。具体如下:def fit(self, data, *args, **kwds):
floc = kwds.get('floc', None)
if floc is None:
# loc is not fixed. Use the default fit method.
return super(lognorm_gen, self).fit(data, *args, **kwds)
f0 = (kwds.get('f0', None) or kwds.get('fs', None) or
kwds.get('fix_s', None))
fscale = kwds.get('fscale', None)
if len(args) > 1:
raise TypeError("Too many input arguments.")
for name in ['f0', 'fs', 'fix_s', 'floc', 'fscale', 'loc', 'scale',
'optimizer']:
kwds.pop(name, None)
if kwds:
raise TypeError("Unknown arguments: %s." % kwds)
# Special case: loc is fixed. Use the maximum likelihood formulas
# instead of the numerical solver.
此外,来自R社区的人可能会想,为什么python的输出与R不同。实际上,我不同意使用R作为“引用”,它只是一个软件,不同的软件有不同的算法风格。
例如,R的输出如下所示并不是错误,Python或其他类似Fortran的软件使用完全不同的算法:round(3.5)
[1] 4
round(2.5)
[1] 2