2017-12-11 15 views
0

저는 Von Mises 분포의 매개 변수를 직접 계산하고 Scipy Von Mises 적합 함수와 비교하려고합니다.Von Mises 분포 파라미터 - 일치하지 않는 응답

나는 fit 함수에서 일치하지 않는 결과를 얻고 있습니다. 다음

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 = 0.8pi, 0.9pi] 및 D2 = 0.2pi, 0.1pi]

내 파이썬 기능은 아래와 같다이다 :

출력 :

>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에 대한 e mu는 다릅니다. k는 다른 기호를 가지고 있습니다. d1 그러나 매우 비슷합니다.

왜 이러한 불일치가 발생하는지 잘 모르겠습니다. 나는 손으로 내 견적에 문제가 있는지 궁금 하네. Bishop 's Pattern recognition 텍스트 북 108 페이지에서 M.L.E 추정을 사용하고 있습니다. 모든 통찰력이 인정됩니다.

답변

3

문제는 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에는 두 개의 인수가 필요하기 때문에 두 기호를 알고있는 다른 함수가 있습니다. 당신이 arctan(y/x)을 할 필요는 각도의 범위는 기대를 미리 알고있는 경우가 아니면 일반적으로 arctan2(y, x)을 할 때, 일반적으로

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

: 이렇게하면 예상 된 결과를 제공해야합니다.