clear all;
close all;
clc;
%绘制男女生身高的GMM
%男女生共取2000人,女生平均身高160,男声平均身高180
%产生均值为180,方差为5的一个1*1000的随机数
N1 = 1000;
male=180+sqrt(10)*randn(1,N1);
%产生均值为160,方差为10的一个1*1000的随机数
N2 = 1000;
female=160+sqrt(10)*randn(1,N2);
h=[female male];
%画出混合后的频率分布直方图,产生150个直方图
figure(1)
hist(h,150);
title('身高分布直方图(不区分男女)');
xlabel('身高/cm');
ylabel('人数/人');
%画出生成的男女性的频率分布直方图
figure(2)
hist(female,100);
%设置柱形图颜色
f=findobj(gca,'Type','patch');
set(f,'facecolor','r');
hold on
hist(male,100);%画出生成的男性的频率分布直方图
legend("女","男");
title('身高分布直方图(区分男女)');
xlabel('身高/cm');
ylabel('人数/人');
%GMM的构造
%首先根据经验来分别对男女生的均值、方差和权值进行初始化
mu1_first=170;sigmal_first=10;w1_first=0.75;%男生
mu2_first=160;sigma2_first=10;w2_first=0.25;%女生
iteration=30;%设置迭代次数
outcome=zeros(iteration,6);%定义一个数组来存储每次的迭代结果
% 男生迭代结果
outcome(1,1)=mu1_first;
outcome(1,2)=sigmal_first;
outcome(1,3)=w1_first;
%女生迭代结果
outcome(1,4)=mu2_first;
outcome(1,5)=sigma2_first;
outcome(1,6)=w2_first;%将第一列存储初始值
%开始迭代
for i=1:iteration-1
[mu1_last,sigma1_last,w1_last,mu2_last,sigma2_last,w2_last]=em(male,female,outcome(i,1),outcome(i,2),outcome(i,3),outcome(i,4),outcome(i,5),outcome(i,6));
%将迭代结果依次送入em,更新outcome中的数值
outcome(i+1,1)=mu1_last;
outcome(i+1,2)=sigma1_last;
outcome(i+1,3)=w1_last;
outcome(i+1,4)=mu2_last;
outcome(i+1,5)=sigma2_last;
outcome(i+1,6)=w2_last;
end
%画出男女生的权重迭代历史
figure(3);
x1=1:0.5:iteration;
y1=interp1(outcome(:,3),x1,'spline');
plot(y1,'b','linewidth',1.5);%画出男生的权重迭代历史
hold on;
grid on;
y2=interp1(outcome(:,6),x1,'spline');
plot(y2,'r','linewidth',1.5);%画出女生权重迭代历史
legend('男生权重变化','女生权重变化','location','northeast');%坐标轴设置,将标识框放置在图的左上角
title('权重随迭代次数的变化');
xlabel('迭代次数');
ylabel('权重');
axis([1 iteration 0 1]);
figure(4);
%迭代的最终结果取出
%画高斯混合模型的随迭代次数的变化而变化图形
for i=1:iteration
fprintf("第%d次迭代:\n",i); %输出每次迭代结果
fprintf("男生:\n");
fprintf("\t均值:%f\n",outcome(i,1));
fprintf("\t方差:%f\n",outcome(i,2));
fprintf("\t权重:%f\n",y1(i));
fprintf("女生:\n");
fprintf("\t均值:%f\n",outcome(i,4));
fprintf("\t方差:%f\n",outcome(i,5));
fprintf("\t权重:%f\n\n",y2(i));
t=linspace(140,200,1000);%x轴范围
%女生的概率密度函数
yy2=normpdf(t,outcome(i,4),outcome(i,5));
%男生的概率密度函数
yy1=normpdf(t,outcome(i,1),outcome(i,2));
subplot(5,6,i);
plot(t,yy1,'r','linewidth',1.5);%迭代完成的女生身高概率密度曲线
hold on;
plot(t,yy2,'b','linewidth',1.5);%迭代完成的男生身高概率密度曲线
hold on;
weights1=outcome(:,3);
weights2=outcome(:,6);
y4=weights1(i)*yy1+weights2(i)*yy2;%对两个高斯概率密度图像进行加权
plt=plot(t,y4,'--','linewidth',1.5);%绘画加权后的图像
title(['iteration = ',num2str(i)]);
xlabel('身高/cm');
ylabel('概率密度');
grid on;
end
figure(5);
hold on;
%男生女生以及混合后身高的概率密度曲线
%女生的概率密度函数
yy2=normpdf(t,mu2_last,sigma2_last);
plot(t,yy2,'m','linewidth',1.5);
%男生的概率密度函数
yy1=normpdf(t,mu1_last,sigma1_last);
plot(t,yy1,'linewidth',1.5);
y3=w1_last*yy1+w2_last*yy2;
plot(t,y3,'k','linewidth',1.5);
legend('女生','男生','混合');
title('迭代完成的身高概率密度曲线');
xlabel('身高/cm');ylabel('概率');hold off;%坐标轴设置
hold off;
评论5