Работа с недостаточным потоком при вычислении параметров GMM с использованием EM

#algorithm #matlab #signal-processing

#алгоритм #matlab #обработка сигналов

Вопрос:

В настоящее время я провожу обучение в matlab по матрице образцов logspecrum, я постоянно сталкиваюсь с проблемами недостаточного потока.Я понял, что мне нужно работать с журналами, чтобы справиться с недостаточным потоком. Я все еще борюсь с uderflow, хотя, когда я вычисляю среднее значение (mue), потому что это отрицательно, я не могу работать с журналами, поэтому мне нужны реальные значения, которые уменьшаются. Это уравнения, с которыми я работаю: введите описание изображения здесь

В коде MATLAB я вычисляю log_tau, чтобы избежать недостаточного потока, но при вычислении mue мне нужен exp(log (tau)), который стремится к нулю. Я прилагаю соответствующий код MATLAB ** в коде, который я назвал переменной alpha, является tau …

 for i = 1 : 50
        log_c = Logsum(log_alpha,1) - log(N);
        c = exp(log_c);
        mue = DataMat*alpha./(repmat(exp(Logsum(log_alpha,1)),FrameSize,1));
        log_abs_mue = log(abs(mue));
        log_SigmaSqr = log((DataMat.^2)*alpha) - repmat(Logsum(log_alpha,1),FrameSize,1) - 2*log_abs_mue;
        SigmaSqr = exp(log_SigmaSqr);
        for j=1:N
            rep_DataMat(:,:,j) = repmat(DataMat(:,j),1,M);
            log_gamma(j,:) = log_c - 0.5*(FrameSize*log(2*pi) sum(log_SigmaSqr))   sum((rep_DataMat(:,:,j) - mue).^2./(2*SigmaSqr));
        end
        log_alpha = log_gamma - repmat(Logsum(log_gamma,2),1,M);
        alpha = exp(log_alpha);
    end        
    c = exp(log_c);
    SigmaSqr = exp(log_SigmaSqr);
  

кто-нибудь видит, как я могу этого избежать? или что нужно исправить в коде?

Ответ №1:

Что я сделал, так это добавил эту строку в код MATLAB:

 mue(isnan(mue))=0; %fix 0/0 problem
  

и этот:

 SigmaSqr(SigmaSqr==0)=1;%fix if mue_k = x_k
  

не уверен, что это лучшее решение, но, похоже, работает…
у кого-нибудь есть идея получше?