若已知高斯混合模型的均值、协方差矩阵和权重系数,用函数gmdistribution可以生成一个高斯混合模型。通常我们只有一组样本数据,要将其拟合为高斯混合模型,所用算法为EM算法;matlab中函数fitmdist()可以较好的拟合出高斯混合模型。
实验代码如下:
%高斯混合模型的参数拟合
%产生三个二维的单高斯模型,并用来产生模拟数据
clc; close all; clear all;
k = 3; %单高斯成分个数
mu1 = [-2 -2]'; sigma1 = [1 0; 0 2]; %第一个高斯分布
mu2 = [-3 3]'; sigma2 = [1 0; 0 0.5]; %第二个高斯分布
mu3 = [ 3 -3]'; sigma3 = [0.5 0; 0 1]; %第三个高斯分布
%根据三个高斯模型参数,分别随机产生500个样本点,并组合在一起
rng(1);
X1 = mvnrnd(mu1,sigma1,500); %产生第一类样本数据
X2 = mvnrnd(mu2,sigma2,500); %产生第二类样本数据
X3 = mvnrnd(mu3,sigma3,500); %产生第三类样本数据
X = [X1; X2; X3]; %组成三类样本数据
gm = fitgmdist(X,k); %gm是个结构体,保存了拟合模型的参数
lab = [ones(500,1);2*ones(500,1);3*ones(500,1)]; %三类数据的标签
h = gscatter(X(:,1), X(:,2), lab); %画出三类数据散点图
hold on;
f = @(x,y)pdf(gm,[x,y]); %计算拟合后的概率密度函数值
fcontour(f, '--', 'LineWidth',2);
title('散点图和拟合的高斯模型轮廓');
legend('簇1','簇2','簇3','Location','NE');
set(gca,'Ylim',[-7,7],'Xlim',[-7,7],'FontSize',12);
hold off
properties(gm) %显示拟合模型的属性
Mu = gm.mu %显示拟合模型的均值
Sigma = gm.Sigma %显示拟合模型的协方差
w = gm.ComponentProportion %显示拟合模型的成分比例
其输出为
Mu =
2.9313 -2.9883
-1.9967 -2.0620
-2.9637 3.0801
Sigma(:,:,1) =
0.4878 -0.0162
-0.0162 1.0621
Sigma(:,:,2) =
0.9857 0.0049
0.0049 1.8753
Sigma(:,:,3) =
1.1347 0.0667
0.0667 0.5450
w =
0.3345 0.3307 0.3348
其中w为三种数据的混合比例,Mu为均值,Sigma为协方差矩阵,可见其拟合效果还不错。