我有一个作业,需要在Matlab中实现高斯混合模型(MoG)与期望最大化(EM)算法。作业内容如下:
我目前的代码如下:
clearclcload('data2')%% INITIALIZEK = 20pi = 0.01:((1-0.01)/K):1;for k=1:20 sigma{k} = eye(2); mu(k,:) = [rand(1),rand(1)];end%% Posterior over the laten variablesaddition = 0;for k =1:20 addition = addition + (pi(k)*mvnpdf(x,mu(k,:), sigma{k}));endtest = 0;for k =1:20 gamma{k} = (pi(k)*mvnpdf(x,mu(k), sigma{k})) ./ addition; end
数据有1000行和2列(即1000个数据点)。我的问题是如何计算责任度。当我尝试计算协方差矩阵时,得到的是一个1×1000的矩阵。而我认为协方差矩阵应该是2×2的。
回答:
很遗憾,我不会Matlab,所以我无法判断你的代码哪里有问题,但我可以给出一般性的回答(或许有懂Matlab的人可以看看你的代码是否可以修复)。每个数据点都有一个与之关联的gamma值,这是混合模型中每个成分的指示变量的期望值。计算这些值非常简单:对于第i个数据点和第k个成分,gamma_ik只是第k个成分在第i个点的密度,乘以第k个混合系数(即该点来自第k个成分的先验概率,在你的作业中是pi),然后除以这个量在所有k上的计算结果。因此,对于每个数据点,你会得到一个长度为k的责任度向量,其总和为1。