经过几次调整,我就能使您的分布适合数据:
>像使用w一样,您隐含了一个约束,即0< = w< =1.fit()方法使用的求解器不知道此约束,因此w可能会得到不合理的值.处理此类约束的一种方法是允许w为任意实数值,但是在PDF的公式中,使用phi = 0.5 arctan(w)/ pi将w转换为介于0和1之间的分数phi.
>通用fit()方法使用数值优化例程来找到最大似然估计.像大多数此类例程一样,它需要优化的起点.默认起点是全1,但这并不总是能正常工作.您可以通过在数据之后将值作为位置参数提供给fit()来选择其他起点.我在脚本中使用的值有效;我没有探讨结果对这些初始值有多敏感.
我做了两个估计.在第一个中,我让delta为一个自由参数,在第二个中,我将delta固定为900.
下面的脚本生成以下图:
这是脚本:
from __future__ import division
from scipy.stats import rv_continuous
import numpy as np
import matplotlib.pyplot as plt
class norm2_gen(rv_continuous):
def _argcheck(self, *args):
return True
def _pdf(self, x, m, s, w, delta):
phi = 0.5 + np.arctan(w)/np.p