我不确定如何使用经过训练的高斯混合模型 (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。
ps:我找到了这篇文章,但对我来说似乎是理论上的(A similar post)。如果可以,请在您的回复中添加一些简单的 Matlab 脚本。
非常感谢。一个。
编辑:
当 Amro 回答问题的解决方案时,我有更多问题。
Amro 使用整个数据集创建了一个新的 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);
Amro 得到的如下所示
这可能不适合我的数据,因为它将我标记的 cluster1 和 cluster2 与 cluster1 的一部分混合在一起。这是我试图避免的。
这里我提出的是一个人为的数值例子;但是,在我的实际应用程序中,它处理图像分割问题(例如,cluster1 是我的背景图像,cluster2 是我要分离的对象)。然后我尝试以某种方式“强制”单独的 GMM 以适应单独的类。如果两个聚类相距较远(例如本例中的cluster1和cluster 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-means 聚类的概率版本。是否有资格以这种“监督”的方式使用它?有推荐的论文或参考资料吗?
再次非常感谢您的回复!一个。