1

特定のデータセットで 4 つのコンポーネントを使用してガウス混合モデルをトレーニングする必要があります。このセットは 3 次元で、300 個のサンプルが含まれています。

問題は、 であるため、対数尤度を使用して収束を確認できないことです-Inf。これは、責任の式でガウスを評価する際にゼロ値が丸められた結果です (E ステップを参照)。

私の EM アルゴリズムの実装がこれまでのところ正しいかどうか教えてもらえますか? そして、丸められたゼロ値の問題をどのように説明するのでしょうか?

これが EM アルゴリズムの私の実装です (1 回の反復):

最初に、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

E-ステップでは、次の式を使用して責任を計算しています 責任

対応するコードは次のとおりです。

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これは、E ステップの-Inf一部のgm(k,i)値がゼロであるためです。したがって、対数は明らかに負の無限大です。

どうすればこの問題を解決できますか?

Matlabの精度を上げることで解決できますか?

または、私の実装に何か問題がありますか?

4

1 に答える 1

2

式に従って、gm 量の合計の対数を計算する必要があります。(つまり、 log(sum(gm(i,:))) )。k コンポーネント内で、少なくとも 1 つが 0 より大きい可能性を持ちます。これで問題が解決することが期待されます。

もう 1 つの非常に一般的な注意点として、指数関数としての関数に対して数値が大きすぎる場合、および正しい数式を使用していると確信している場合は、いつでも数量の対数を使用して作業を試みることができます。ただし、0 は exp(-746) の適切な近似であるため、ここでこれを行う必要はありません ;)

于 2015-07-29T17:40:32.007 に答える