所以我试图实现一个EM算法来训练一个高斯类条件模型来分类数据。我目前陷入了M步骤,因为我无法弄清楚如何计算协方差矩阵。
问题是我有一个大数据集,使用for循环遍历每个点会慢下来。我也不能使用协方差函数cov(),因为我需要使用我用这个公式计算的均值(mu符号一)
有没有办法调整cov()来使用我想要的意思?或者还有另一种方法可以在没有循环的情况下做到这一点吗?
编辑:忘了解释数据矩阵是什么样的。它是一个nx3,其中每一行都是一个数据点。
技术上需要适用于一般情况nxm,但n通常很大(1000或更多),而m相对较小。
答案 0 :(得分:0)
您可以手动计算协方差矩阵。让data
为包含所有变量的矩阵(例如,[x y]
)和mu
您的自定义均值,按以下步骤操作:
n = size(data,1);
data_dem = data - (ones(n,1) * mu);
cov_mat = (data_dem.' * data_dem) ./ (n - 1);
请注意,我使用Bessel's Correction(n-1
代替n
),因为Matlab cov
函数使用它,除非您将第三个参数指定为{{1} }:
1
C = cov(___,w)指定任何一个的归一化权重 以前的语法。当w = 0(默认值)时,C由数字标准化 观察-1。当w = 1时,它按数量归一化 观察结果。