估计 Von Mises 分布的参数 Scipy - 不一致的答案
Estimating parameters of Von Mises Distribution Scipy - Inconsistent Answers
我正在手动计算 Von Mises 分布的参数,并想与 Scipy Von Mises 拟合函数进行比较。
我得到的拟合函数结果不一致。
我的两个数据集是 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 估计。任何见解都值得赞赏。
问题出在计算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)
,除非您事先知道期望的角度范围。
我正在手动计算 Von Mises 分布的参数,并想与 Scipy Von Mises 拟合函数进行比较。
我得到的拟合函数结果不一致。
我的两个数据集是 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 估计。任何见解都值得赞赏。
问题出在计算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)
,除非您事先知道期望的角度范围。