24 개의 매개 변수가있는 최대 우도 추정이 필요한 M 단계에서 EM 추정을 수행하고 있습니다. 나는 R에서 nlm/optim/maxLik 함수를 시도했다. 모두 매우 느리다. 어떤 제안이라도 환영합니다. 감사. (선택이, M, S, K, N 및 알파 알려져있다.)r의 MLE가 매우 느립니다.
logl <- function(theta,choices,M,S,K,N,Alpha){
betas <- theta[(1:(S*(K+1)))]
betas<-matrix(betas,S,K+1,byrow=TRUE)
loglik <-for (n in 1:N){
pr1s=foreach (s=1:S) %dopar%{
pr11=foreach (i = 1:K) %dopar%{
exp(sum(betas[s,]*choices[[n]][i,]))/exp(sum(M[[i]]%*%betas[s,]))}
pr11=as.numeric(pr11)
prod(pr11)
}
pr1sn=as.numeric(pr1s)
l[n]= sum(Alpha*pr1sn)
}
L=-sum(log((l)))
return(L)}
내가 얻고 싶은 것은 :
ops=nlm(logl,theta.start,choices=choices,M=M,S=2,K=11,N=3,Alpha=Alpha,hessian=TRUE)
"매우 느린"이란 무엇입니까? 초입니까? 의사록? 시간? 일? paralellization없이 시도 했습니까? 반복 횟수가 적 으면 오버 헤드의 가치가 없을 수도 있습니다. 중첩 된 병렬 루프가 실제로 예상대로 작동하는지는 다소 의심 스럽지만이를 시도한 적이 없습니다. 어떤 부분이 느린지 알아 내고, 벡터화하려고 시도하는 기능을 프로파일 링하십시오. – Roland
더 자세한 정보를 제공해야합니다. 모델을 설명하고 LogL 함수를 수학 표기법으로 작성하고 장난감 데이터 세트를 제공하여 몇 가지 시도를 할 수 있습니다. – Elvis
내가 바꾸고 싶은 첫 번째 일은 (단지 단순하기 때문에) 필요할 때까지 $ \ exp (x) $의 사용을 피하는 것입니다. 적어도 K에 대해 내부 루프를 제거 할 수 있다고 생각합니다. 먼저 분석적으로 $ \ exp (x-y) $와 같은 $ \ frac {\ exp (x)} {\ exp (y)} $를가집니다. 그런 다음 로그 합계의 지수 함수 인 지수 값을 계산합니다. \ exp (x_1-y_1) \ exp (x_2-y_2) ... \ exp (x_K-y_K) = \ exp (x_1 + ... + x_K-y_1 -...- y_K) $. 이것들이 정답에 아무런 차이가 없지만, 그것은 당신의 컴퓨팅 시간에 큰 차이를 만들 수 있습니다. – probabilityislogic