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.')
3. 結果

4. 參考
[1] MATLAB高斯混合數據的生成
