2013-03-13 9 views
5

W MATLAB Statystyki tutoriale znajduje się sekcja o nazwie „Dopasowywanie bardziej skomplikowany Dystrybucja: mieszanina dwóch normalne” http://www.mathworks.com/help/stats/examples/fitting-custom-univariate-distributions.htmlMATLAB - Maksymalny prawdopodobieństwo dla funkcji okresowej (kąty)

pdf_normmixture = @(x,p,mu1,mu2,sigma1,sigma2) ... 
        p*normpdf(x,mu1,sigma1) + (1-p)*normpdf(x,mu2,sigma2); 
lb = [0 -Inf -Inf 0 0]; 
ub = [1 Inf Inf Inf Inf]; 
start = [pStart muStart sigmaStart sigmaStart]; 
paramEsts = mle(x, 'pdf',pdf_normmixture, 'start',start, 'lower',lb, 'upper',ub) 

chciałbym zastosować tę samą metodologię dla dopasowania dwóch lub więcej normaliów do jednowymiarowego zestawu wartości, które mam, ale w domenie okresowej. To znaczy kąty, które mają wartości 0 ° do 360 ° połączone razem jako zakres kołowy. Nie wiem, jak to zgłosić, aby MATLAB mógł zrozumieć tego rodzaju terminologię.

Czy można zmienić tę implementację, aby dodać przypadek zakresu kołowego?

Pozdrawiam, Ignacio

+0

Jest to bardzo interesujący problem i chciałbym usłyszeć pewne zasadnicze sposoby robienia tego. Jednak mogą istnieć lepsze odpowiedzi na temat gdzieś mniej zorientowanych na programowanie - np. http://stats.stackexchange.com/ –

+0

Powiem to tam. Czy powinienem usunąć ten wpis stąd? Dzięki –

+0

Nie, chyba że jest więcej konsensusu - myślę, że podobne pytania pojawiają się tutaj dużo, więc nie powinno być problemu. Mogą również istnieć pewne rozwiązania MATLAB ... –

Odpowiedz

1

używam dystrybucji von Misesa http://en.wikipedia.org/wiki/Von_Mises_distribution, który uważa się bliskim przybliżeniem zawinięty normalny (patrz warunki w tematach na „” okrągłe statystyki S. Rao Jammalamadaka, A. Sengupta” "). Niestety nie mam programu Matlab, aby go przetestować, ale myślę, że kod działa. Tak więc, coś takiego można zrobić, jeśli zbliżanie jest ważny:

Główną funkcją:

% należy podać theta wektor kolumnowy 0-2pi

n=size(theta,1); 

mu=0; 

k=1; 

theParameters=[mu;k]; 
options = optimset('TolFun',0.01); 
outputPar = fminsearch('ml',theParameters,options,n,theta); 

funkcja ML

function mLike=ml(theParameters,n,theta) 

mu=theParameters(1,1); 
k=theParameters(2,1); 

theSum=0; 
for i=1:n 
    theSum=theSum+k*cos(theta(i,1)-mu); 
end  
mLike=-n*log(2*pi*besselj(0,k)) + theSum; 
mLike=-mLike; 

Mam nadzieję, że to pomoże! Jest także zestaw narzędzi w R, który zajmuje się tego rodzaju szacowaniem. http://cran.r-project.org/web/packages/circular/circular.pdf.

Jeśli masz problemy z dodatnim wynikiem k, aby uniknąć radzenia sobie z ograniczoną optymalizacją, wykonaj k = exp (kk) i zamiast tego oszacuj kk.

+0

Nawiasem mówiąc, jeśli powyższe przybliżenie jest nieprawidłowe, być może dane nie są normalne! – DanielTheRocketMan

Powiązane problemy