混合高斯模型简介
混合高斯模型基于多变量正态分布。类gmdistribution通过使用EM算法来拟合数据,它基于各观测量计算各成分密度的后验概率。
高斯混合模型常用于聚类,通过选择成分最大化后验概率来完成聚类。与k-means聚类相似,高斯混合模型也使用迭代算法计算,最终收敛到局部最优。高斯混合模型在各类尺寸不同、聚类间有相关关系的的时候可能比k-means聚类更合适。使用高斯混合模型的聚类属于软聚类方法(一个观测量按概率属于各个类,而不是完全属于某个类),各点的后验概率提示了各数据点属于各个类的可能性。
高斯混合聚类
高斯混合分布可以用来做数据聚类。
1. 为了展示高斯混合聚类的过程,先利用mvnrnd函数产生一些二变量高斯分布仿真数据:
mu1 = [1 2];
sigma1 = [3 .2; .2 2];
mu2 = [-1 -2];
sigma2 = [2 0; 0 1];
X = [mvnrnd(mu1,sigma1,200);mvnrnd(mu2,sigma2,100)];
scatter(X(:,1),X(:,2),10,‘ko‘)
2. 然后拟合两成分高斯混合分布。这里,准确的成分数是已知的,而在处理实际数据时就需要通过测试、比较多个成分的拟合结果来决定这一数量。
options = statset(‘Display‘,‘final‘);
gm = gmdistribution.fit(X,2,‘Options‘,options);
结果为
49 iterations, log-likelihood = -1207.91
3. 绘制估计的两成分混合分布的概率密度等高线如下。可以看到,两变量正态成分是相互重叠的,但是它们的峰值不同,这表明数据有理由分成两个聚类:
hold on
ezcontour(@(x,y)pdf(gm,[x y]),[-8 6],[-8 6]);
hold off
4. 使用cluster函数将拟合的混合分布数据分离成两类:
idx = cluster(gm,X);
cluster1 = (idx == 1);
cluster2 = (idx == 2);
scatter(X(cluster1,1),X(cluster1,2),10,‘r+‘);
hold on
scatter(X(cluster2,1),X(cluster2,2),10,‘bo‘);
hold off
legend(‘Cluster 1‘,‘Cluster 2‘,‘Location‘,‘NW‘)
每个聚类与混合分布中的一个成分有关。cluster基于估计的后验概率对各点做分类,属于哪个类的后验概率大则属于哪个类。posterior函数可以返回这个后验概率值。
例如,绘制各点属于第一成分的后验概率如下
P = posterior(gm,X);
scatter(X(cluster1,1),X(cluster1,2),10,P(cluster1,1),‘+‘)
hold on
scatter(X(cluster2,1),X(cluster2,2),10,P(cluster2,1),‘o‘)
hold off
legend(‘Cluster 1‘,‘Cluster 2‘,‘Location‘,‘NW‘)
clrmap = jet(80); colormap(clrmap(9:72,:))
ylabel(colorbar,‘Component 1 Posterior Probability‘)
使用高斯混合分布做软聚类
另一种分类的方法是使用前面计算的后验概率做软聚类。各点可以被赋予属于各类的一个得分,这个得分就是简单的后验概率,描述了各点与各聚类原型的相似程度。这样,各点可以按在聚类中的得分排序:
[~,order] = sort(P(:,1));
plot(1:size(X,1),P(order,1),‘r-‘,1:size(X,1),P(order,2),‘b-‘);
legend({‘Cluster 1 Score‘ ‘Cluster 2 Score‘},‘location‘,‘NW‘);
ylabel(‘Cluster Membership Score‘);
xlabel(‘Point Ranking‘);
尽管在数据散点图中很难看出分类的好坏,但得分图可以更明显的看出拟合的分布很好地完成了数据聚类,在得分0.5附近的点很少,即大多数点都易于分开。
使用高斯混合分布的软聚类与模糊k-means聚类方法相似,后者也是赋予各点相对各类的一个得分,但它进一步假设各聚类形状上近似球形,尺寸大小上也近似相等。这相当于所有成分协方差矩阵相同的高斯混合分布。而gmdistribution函数允许你设定各成分不同的协方差,默认情况下是为每个成分估计一个分离的无约束的协方差矩阵;而如果设定估计一个公共的对角协方差矩阵,则就与k-means相近了:
gm2 = gmdistribution.fit(X,2,‘CovType‘,‘Diagonal‘,...
‘SharedCov‘,true);
上面对于协方差的选项与模糊k-means聚类相似,但更灵活,允许不同的变量有不等的方差。
计算软聚类的得分可以不用先算硬聚类,可以直接使用posterior或cluster函数直接计算,如下
P2 = posterior(gm2,X); % equivalently [idx,P2] = cluster(gm2,X)
[~,order] = sort(P2(:,1));
plot(1:size(X,1),P2(order,1),‘r-‘,1:size(X,1),P2(order,2),‘b-‘);
legend({‘Cluster 1 Score‘ ‘Cluster 2 Score‘},‘location‘,‘NW‘);
ylabel(‘Cluster Membership Score‘);
xlabel(‘Point Ranking‘);
对新来点的聚类
前面的例子中,混合分布的数据拟合与数据聚类是分开的,两步中使用了相同的数据。当然你也可以在cluster函数做聚类时使用新的数据点,实现新来点在原数据聚类中的分类。
1. 给定数据集X,首先拟合高斯混合分布,前面的代码已经实现
gm
gm =
Gaussian mixture distribution with 2 components in 2 dimensions
Component 1:
Mixing proportion: 0.312592
Mean: -0.9082 -2.1109
Component 2:
Mixing proportion: 0.687408
Mean: 0.9532 1.8940
2. 然后可以对新数据集中的点分类到对X的聚类中
Y = [mvnrnd(mu1,sigma1,50);mvnrnd(mu2,sigma2,25)];
idx = cluster(gm,Y);
cluster1 = (idx == 1);
cluster2 = (idx == 2);
scatter(Y(cluster1,1),Y(cluster1,2),10,‘r+‘);
hold on
scatter(Y(cluster2,1),Y(cluster2,2),10,‘bo‘);
hold off
legend(‘Class 1‘,‘Class 2‘,‘Location‘,‘NW‘)
与前面的例子一样,各点的后验概率被作为得分,而不是直接做硬聚类。
完成聚类的新数据集Y应该来自与X相同的种群,即来自X的混合分布中,因为在估计Y的后验概率时使用了基于X拟合的混合高斯分布的联合概率。