簡體   English   中英

Matlab:EM,無gm分布的高斯混合模型

[英]Matlab: EM for Gaussian Mixture Models without gmdistribution

我必須在給定的數據集上使用四個分量來訓練高斯混合模型。 該集合是三維的,包含300個樣本。

問題是我無法使用對數似然法檢查收斂性,因為它是-Inf 這是由於在責任公式中評估高斯時舍入了零值(請參見E步)。

您能告訴我到目前為止我的EM算法實現是否正確嗎? 以及如何用四舍五入的零值解決問題?

這是我對EM算法的實現(一次迭代):

首先,我使用kmeans 初始化組件的均值和協方差:

load('data1.mat');

X = Data'; % 300x3 data set
D = size(X,2); % dimension
N = size(X,1); % number of samples
K = 4; % number of Gaussian Mixture components

% Initialization
p = [0.2, 0.3, 0.2, 0.3]; % arbitrary pi
[idx,mu] = kmeans(X,K); % initial means of the components

% compute the covariance of the components
sigma = zeros(D,D,K);
for k = 1:K
    sigma(:,:,k) = cov(X(idx==k,:));
end

對於電子步驟,我使用以下公式來計算責任 責任

這是相應的代碼:

gm = zeros(K,N); % gaussian component in the nominator - 
                 % some values evaluate to zero
sumGM = zeros(N,1); % denominator of responsibilities
% E-step:  Evaluate the responsibilities using the current parameters
% compute the nominator and denominator of the responsibilities
for k = 1:K
    for i = 1:N
        % HERE values evalute to zero e.g. exp(-746.6228) = -Inf
        gm(k,i) = p(k)/sqrt(det(sigma(:,:,k))*(2*pi)^D)*exp(-0.5*(X(i,:)-mu(k,:))*inv(sigma(:,:,k))*(X(i,:)-mu(k,:))');
        sumGM(i) = sumGM(i) + gm(k,i);
    end
end
res = zeros(K,N); % responsibilities
Nk = zeros(4,1);
for k = 1:K
    for i = 1:N
         res(k,i) = gm(k,i)/sumGM(i);
    end
    Nk(k) = sum(res(k,:));
end

Nk(k)使用M步驟中給出的公式計算。

M-步

使用當前職責重新估算參數

% M-step: Re-estimate the parameters using the current responsibilities
mu = zeros(K,3);
for k = 1:K
    for i = 1:N
        mu(k,:) = mu(k,:) + res(k,i).*X(k,:);
        sigma(:,:,k) = sigma(:,:,k) + res(k,i).*(X(k,:)-mu(k,:))*(X(k,:)-mu(k,:))';
    end
    mu(k,:) = mu(k,:)./Nk(k);
    sigma(:,:,k) = sigma(:,:,k)./Nk(k);
    p(k) = Nk(k)/N;
end

現在,為了檢查收斂性,使用以下公式計算對數似然: 數似然

% Evaluate the log-likelihood and check for convergence of either 
% the parameters or the log-likelihood. If not converged, go to E-step.
loglikelihood = 0;
for i = 1:N
    for k = 1:K
         loglikelihood = loglikelihood + log(gm(k,i));
    end
end

loglikelihood-Inf因為E步中的某些gm(k,i)值為零。 因此,對數顯然是負無窮大。

我怎么解決這個問題?

可以通過提高Matlab的精度來解決嗎?

還是我的實現有問題?

根據公式,您應該計算gm數量總和的對數。 (因此,log(sum(gm(i,:))))。 在k個分量內,至少一個可能性大於0。這有望解決您的問題。

另一個非常籠統的說法是,當數字對於作為指數函數的函數來說太大時,並且當您確定使用正確的公式時,您始終可以嘗試使用數量的對數。 但是您不必在這里這樣做,因為0是exp(-746);)的良好近似值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM