Значения Nan из расчета нормального распределения данных в MATLAB?

Я использую алгоритм EM с Gaussian Mixture, но проблема в том, что мои данные настолько скудны, что значения идут с очень маленькими значениями, близкими к нулю.

Вот проблемная часть

for i=1:ncomp,
  **logdenom = -log((2*pi)^(dim/2)*sqrt(abs(det(Cov(:,:,i)))));**  
  dist = mahalan(X,Mean(:,i),Cov(:,:,i));
  y(i,:) = logdenom-0.5*dist;
end

Строка со звездочкой - это проблема. Во время расчета он возвращает значения «inf» после полученных значений NAN. Как я могу справиться с этой проблемой. Я вычисляю это и без логарифмической функции

for i=1:ncomp,
  dist = mahalan(X,Mean(:,i),Cov(:,:,i));
  y(i,:) = exp(-0.5*dist)/sqrt((2*pi)^dim*det(Cov(:,:,i))); % problem
end

но проблема та же самая и из-за того, что значения Cov такие маленькие.


person erogol    schedule 18.12.2012    source источник


Ответы (1)


один из способов предотвратить inf в этой ситуации - просто использовать

 logdenom = -log( eps + (2*pi)^...  )

Я нахожу это v полезным для разреженных данных при оценке максимального правдоподобия. Я понятия не имею, будет ли это полезно в EM! По сути, нулевые члены становятся чем-то вроде +36, поэтому не слишком велики, но все же позволяют увеличивать небольшие вероятности, для которых вам нужно log.

person Sanjay Manohar    schedule 18.12.2012