我不确定如何使用训练的高斯混合模型(GMM)对一些新数据进行预测。例如,我已经从3个不同的类(集群)中获得了一些标记的数据。对于每一类数据点,我适合一个GMM(gm1,gm2和gm3)。假设我们知道每个类的高斯混合数(例如k1 = 2,k2 = 1和k3 = 3),或者可以使用Akaike信息准则(AIC)估计(优化)它的数量。然后,当我得到一些新的数据集时,我怎么能知道它是否更可能属于第1,2或3类?使用训练的高斯混合模型标记新数据
一些MATLAB脚本显示了我的意思是:
clc; clf; clear all; close all;
%% Create some artificial training data
% 1. Cluster 1 with two mixture of Gaussian (k1 = 2)
rng default; % For reproducibility
mu1 = [1 2];
sigma1 = [3 .2; .2 2];
mu2 = [-1 -2];
sigma2 = [2 0; 0 1];
X1 = [mvnrnd(mu1,sigma1,200); mvnrnd(mu2,sigma2,100)];
options1 = statset('Display', 'final');
k1 = 2;
gm1 = fitgmdist(X1, k1, 'Options', options1);
% 2. Cluster 2 with one mixture of Gaussian (k2 = 1)
mu3 = [6 4];
sigma3 = [3 .1; .1 4];
X2 = mvnrnd(mu3,sigma3,300);
options2 = statset('Display', 'final');
k2 = 1;
gm2 = fitgmdist(X2, k2, 'Options', options2);
% 3. Cluster 3 with three mixture of Gaussian (k3 = 3)
mu4 = [-5 -6];
sigma4 = [1 .1; .1 1];
mu5 = [-5 -10];
sigma5 = [6 .1; .1 1];
mu6 = [-2 -15];
sigma6 = [8 .1; .1 4];
X3 = [mvnrnd(mu4,sigma4,200); mvnrnd(mu5,sigma5,300); mvnrnd(mu6,sigma6,100)];
options3 = statset('Display', 'final');
k3 = 3;
gm3 = fitgmdist(X3, k3, 'Options', options3);
% Display
figure,
scatter(X1(:,1),X1(:,2),10,'ko'); hold on;
ezcontour(@(x,y)pdf(gm1, [x y]), [-12 12], [-12 12]);
scatter(X2(:,1),X2(:,2),10,'ko');
ezcontour(@(x,y)pdf(gm2, [x y]), [-12 12], [-12 12]);
scatter(X3(:,1),X3(:,2),10,'ko');
ezcontour(@(x,y)pdf(gm3, [x y]), [-12 12], [-12 12]); hold off;
我们可以得到图中:
然后我们有例如一些新的测试数据:
%% Create some artificial testing data
mut1 = [6.1 3.8];
sigmat1 = [3.1 .1; .1 4.2];
mut2 = [5.8 4.5];
sigmat2 = [2.8 .1; .1 3.8];
Xt1 = [mvnrnd(mut1,sigmat1,500); mvnrnd(mut2,sigmat2,100)];
figure,
scatter(Xt1(:,1),Xt1(:,2),10,'ko');
xlim([-12 12]); ylim([-12 12]);
我故意将测试数据类似于Cluster 2数据。在我们使用GMM进行训练之后,我们能否以某种方式预测新测试数据的标签?对于每个类的预测,是否有可能得到一些概率(p1 = 18%,p2 = 80%和p3 = 2%)。因为我们已经得到了p2 = 80%,所以我们可以有一个硬分类,即新的测试数据被标记为簇2.
p.s .:我找到了这篇文章,但对我来说似乎理论上(A similar post)。如果你可以请在你的回复中加入一些简单的Matlab脚本。
非常感谢。 A.
编辑:
至于荷银回答该问题的解决方案,我有更多的问题。
荷银创造了一个新的GMM使用整个数据集的一些初始化:
% initial parameters of the new GMM (combination of the previous three) % (note PComponents is normalized according to proportion of data in each subset) S = struct('mu',[gm1.mu; gm2.mu; gm3.mu], ... 'Sigma',cat(3, gm1.Sigma, gm2.Sigma, gm3.Sigma), ... 'PComponents',[gm1.PComponents*n1, gm2.PComponents*n2, gm3.PComponents*n3]./n); % train the final model over all instances opts = statset('MaxIter',1000, 'Display','final'); gmm = fitgmdist(X, k, 'Options',opts, 'Start',S);
什么荷银得到的是类似下面
这可能不适合我因为它将我标记的cluster1和cluster2与cluster1的一部分混合在一起。这是我想要避免的。
这里我介绍的是一个人工数值例子;然而,在我的实际应用中,它处理图像分割问题(例如,cluster1是我的背景图像,cluster2是我想分离的对象)。然后,我尝试以某种方式“强制”单独的GMM以适应不同的课程。如果两个簇很远(例如本例中的簇1和簇3),那么使用Amro的方法来组合所有数据然后进行GMM拟合就没有问题。但是,当我们对图像数据进行训练时,由于分辨率的限制(由于部分音量效应),将背景与对象分离绝不是完美的;因此,如图所示,很可能我们有cluster1与cluster2重叠的情况。我想也许混合所有的数据,然后做拟合会导致一些问题,以进一步预测新的数据,我说得对吗?
然而,思维一点点之后,我想做现在要做的是:
% Combine the mixture of Gaussian and form a new gmdistribution muAll = [gm1.mu; gm2.mu; gm3.mu]; sigmaAll = cat(3, gm1.Sigma, gm2.Sigma, gm3.Sigma); gmAll = gmdistribution(muAll, sigmaAll); pt1 = posterior(gmAll, Xt1);
你们有什么觉得?或者它相当于Amro的方法?如果是这样,有没有办法强制我的训练GMM分开?
此外,我有关于使用
posterior
函数的基本原理的问题。基本上,我想估计给定GMM拟合的测试数据的可能性。那么为什么我们现在计算后验概率呢?或者这只是一个命名问题(换句话说,'后验概率'='可能性')?据我所知,GMM一直被用作无监督方法。有人甚至向我提到GMM是k均值聚类的概率版本。它有资格以这种'监督'的风格使用它吗?任何推荐的论文或参考?
非常感谢您的回复! 答:
你可能会发现我以前的答案也很有用:[了解高斯混合模型的概念](http://stackoverflow.com/a/26070081/97160) – Amro 2014-10-08 23:37:32
感谢您的链接! – 2014-10-10 09:49:38
另外,感谢您的回复。请在原始帖子中查看我的编辑,以便讨论一些问题。 – 2014-10-10 09:50:45