凯鲁嘎吉
用书写铭记日常,最迷人的不在远方

MATLAB用“fitgmdist”函数拟合高斯混合模型(一维数据)

作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/

    在MATLAB中“fitgmdist”的用法及其GMM聚类算法中介绍过"fitgmdist"函数的用法,这次用"fitgmdist"拟合一维数据。

1. 一维高斯混合数据的产生

function data=generate_GMM()
%前两列是数据,最后一列是类标签
%数据规模
N=300;
%数据维度
% dim=1;
%%
%混合比例
para_pi=[0.3 0.2 0.5];
%第一类数据
mul=0; % 均值
S1=1; % 协方差
data1=mvnrnd(mul, S1, para_pi(1)*N); % 产生高斯分布数据
%第二类数据
mu2=4;
S2=2;
data2=mvnrnd(mu2,S2,para_pi(2)*N);
%第三类数据
mu3=-4;
S3=1;
data3=mvnrnd(mu3,S3,para_pi(3)*N);
data = [data1, ones(para_pi(1)*N,1); data2, 2*ones(para_pi(2)*N,1); data3, 3*ones(para_pi(3)*N,1)];
save data_gauss data

2. 拟合高斯混合模型

load data_gauss
data=data(:,1);
K=3;
gmm=fitgmdist(data, K);
% 自定义参数
% RegularizationValue=0.001;   %正则化系数,协方差矩阵求逆
% MaxIter=1000;   %最大迭代次数
% TolFun=1e-8;   %终止条件
% gmm=fitgmdist(data, K, 'RegularizationValue', RegularizationValue, 'CovarianceType', 'diagonal', 'Start', 'plus', 'Options', statset('Display', 'final', 'MaxIter', MaxIter, 'TolFun', TolFun));
[N, D]=size(data);
mu=gmm.mu;  %均值
Sigma=gmm.Sigma;   %协方差矩阵
ComponentProportion=gmm.ComponentProportion;  %混合比例
Y=zeros(N, K);
for k=1:K
    Y(:,k)=ComponentProportion(k).*normpdf(data, mu(k), Sigma(:,:,k));
end
YY=sum(Y, 2);
plot(data,YY,'r.')

或者对数据排一下顺序:

load data_gauss
data=data(:,1);
K=3;
gmm=fitgmdist(data, K);
% 自定义参数
% RegularizationValue=0.001;   %正则化系数,协方差矩阵求逆
% MaxIter=1000;   %最大迭代次数
% TolFun=1e-8;   %终止条件
% gmm=fitgmdist(data, K, 'RegularizationValue', RegularizationValue, 'CovarianceType', 'diagonal', 'Start', 'plus', 'Options', statset('Display', 'final', 'MaxIter', MaxIter, 'TolFun', TolFun));
[N, D]=size(data);
mu=gmm.mu;  %均值
Sigma=gmm.Sigma;   %协方差矩阵
ComponentProportion=gmm.ComponentProportion;  %混合比例
Y=zeros(N, K);
for k=1:K
    Y(:,k)=ComponentProportion(k).*normpdf(data, mu(k), Sigma(:,:,k));
end
YY=sum(Y, 2);
[X, index] = sort(data);
YY = YY(index);
plot(X,YY,'r-')

3. 结果

注意:这两个图不一样的原因是产生的数据每次都是随机的,我用的两组不同的数据得到的结果。

4. 参考

[1] MATLAB高斯混合数据的生成

[2] MATLAB中“fitgmdist”的用法及其GMM聚类算法

posted on 2020-01-06 22:15  凯鲁嘎吉  阅读(9370)  评论(7编辑  收藏  举报