估计Von Mises分布Scipy的参数 - 不一致的答案

时间:2017-12-11 04:37:04

标签: python scipy statistics probability probability-density

我正在手动计算Von Mises分布的参数,并希望与Scipy Von Mises拟合函数进行比较。

我从fit函数得到的结果不一致。

我的两个数据集是d1 = [0.8pi,0.9pi]和d2 = [0.2pi,0.1pi]

我的python函数如下:

def calc(data):
    '''Takes a 1-D dataset and uses the scipy von mises to learn parameters and also calculates them by hand
    using the regular M.L estimation for mean and the bannerjee et al (2005) approximation for concentraion factor
    params: 1-D dataset in radians
    '''
    res = vonmises.fit(data, fscale=1)
    mu = np.arctan(sum(np.sin(data))/sum(np.cos(data)))
    A = sum(np.cos(data))*(1/len(data))*np.cos(mu)+sum(np.sin(data))*np.sin(mu)*(1/len(data))
    k = A*(2-A**2)/(1-A**2)
    print('mu and k by hand: ', mu, k)
    print('mu and k from fit function', res[1],res[0])

我的结果如下:

输出:

>d1:
mu and k by hand:  0.471238898038 41.3480495503
mu and k from fit function 0.471238858132 40.8666881759

>d2:
mu and k by hand:  -0.471238898038 -41.3480495503
mu and k from fit function 2.67035368203 40.8666556123

如您所见,d2的mu是不同的。 k有不同的标志。 d1非常相似。

我不确定为什么会出现这种差异。我想知道手动估算是否存在问题。我使用了Bishop的模式识别教科书第109页中的M.L.E估计。任何见解都值得赞赏。

1 个答案:

答案 0 :(得分:4)

问题出在mu

的计算中
mu = np.arctan(sum(np.sin(data))/sum(np.cos(data)))

arctan只能获得-pi / 2和+ pi / 2之间的角度。它不知道圆圈的哪个象限。请考虑一下:arctan(1 / 1)arctan(-1 / -1)相同。两者都产生45度的角度,但后者应该是135度。

有一个不同的函数arctan2,它知道这两个符号,因为它需要两个参数。这应该会给你预期的结果:

mu = np.arctan2(sum(np.sin(data)), sum(np.cos(data)))

一般情况下,当您需要arctan(y/x)时,您通常需要arctan2(y, x),除非您事先知道预期的角度范围。