我正在手动计算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估计。任何见解都值得赞赏。
答案 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)
,除非您事先知道预期的角度范围。