Matlab:没有 gmdistribution 的高斯混合模型的 EM
Matlab: EM for Gaussian Mixture Models without gmdistribution
我必须在给定数据集上使用四个分量来训练高斯混合模型。
该集合是三维的,包含 300 个样本。
问题是我无法使用对数似然检查收敛性,因为它是 -Inf
。这是在评估责任公式中的高斯分布时四舍五入的零值的结果(参见 E-step)。
你能告诉我到目前为止我对 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
对于 E-step 我使用以下公式来计算责任
对应代码如下:
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数量之和的对数。 (所以,日志(总和(gm(i,:))))。在k个成分中,至少有一个的似然大于0,希望能解决你的问题。
另一个非常笼统的评论,当数字对于指数函数这样的函数来说太大时,并且当您确定您使用的是正确的公式时,您总是可以尝试使用数量的对数。但是你不需要在这里这样做,因为 0 是 exp(-746) 的一个很好的近似值;)
我必须在给定数据集上使用四个分量来训练高斯混合模型。 该集合是三维的,包含 300 个样本。
问题是我无法使用对数似然检查收敛性,因为它是 -Inf
。这是在评估责任公式中的高斯分布时四舍五入的零值的结果(参见 E-step)。
你能告诉我到目前为止我对 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
对于 E-step 我使用以下公式来计算责任
对应代码如下:
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数量之和的对数。 (所以,日志(总和(gm(i,:))))。在k个成分中,至少有一个的似然大于0,希望能解决你的问题。
另一个非常笼统的评论,当数字对于指数函数这样的函数来说太大时,并且当您确定您使用的是正确的公式时,您总是可以尝试使用数量的对数。但是你不需要在这里这样做,因为 0 是 exp(-746) 的一个很好的近似值;)