MATLAB用「fitgmdist」函數擬合高斯混合模型(一維數據)

MATLAB用「fitgmdist」函數擬合高斯混合模型(一維數據)

做者:凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/html

    在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.')

3. 結果

4. 參考

[1] MATLAB高斯混合數據的生成函數

[2] MATLAB中「fitgmdist」的用法及其GMM聚類算法post

相關文章
相關標籤/搜索