给出我通过MATLAB将未知概率分布的数据拟合成高斯混合分布的代码
时间: 2023-12-01 18:03:57 浏览: 32
以下是通过MATLAB将未知概率分布的数据拟合成高斯混合分布的代码:
```matlab
% 生成未知概率分布的数据
data = randn(1000,1);
% 初始高斯混合分布参数设置
k = 3; % 高斯分布的数量
mu = randn(k,1); % 高斯分布的均值
sigma = rand(k,1)+1; % 高斯分布的标准差
p = ones(k,1)/k; % 高斯分布的权重
% 迭代更新高斯混合分布参数
for iter = 1:100
% E步:计算每个数据点属于每个高斯分布的概率
for i = 1:k
pdf(:,i) = p(i)*normpdf(data,mu(i),sigma(i));
end
gamma = pdf./sum(pdf,2);
% M步:更新高斯分布的均值、标准差和权重
mu_new = sum(gamma.*data)./sum(gamma);
sigma_new = sqrt(sum(gamma.*(data-mu_new).^2)./sum(gamma));
p_new = mean(gamma);
% 判断收敛
if norm(mu_new-mu)<1e-6 && norm(sigma_new-sigma)<1e-6 && norm(p_new-p)<1e-6
break;
end
% 更新高斯混合分布参数
mu = mu_new;
sigma = sigma_new;
p = p_new;
end
% 绘制拟合后的高斯混合分布曲线
x = linspace(min(data),max(data),1000);
pdf_fit = zeros(size(x));
for i = 1:k
pdf_fit = pdf_fit+p(i)*normpdf(x,mu(i),sigma(i));
end
figure;
histogram(data,'Normalization','pdf','BinWidth',0.5);
hold on;
plot(x,pdf_fit,'LineWidth',2);
xlabel('Data');
ylabel('Probability Density');
legend('Data','GMM Fitting');
```