3

トレーニング済みガウス混合モデル (GMM) を使用して新しいデータの予測を行う方法がわかりません。たとえば、3 つの異なるクラス (クラスター) から抽出されたラベル付きデータをいくつか取得しました。データ ポイントのクラスごとに、GMM (gm1、gm2、および gm3) を当てはめます。各クラスの混合ガウスの数 (例: k1=2、k2=1、k3=3) がわかっているか、赤池情報量基準 (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;

図を取得できます。

訓練されたGMM

次に、たとえば次のような新しいテスト データを取得しました。

%% 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]);

試験データ

テストデータは意図的にクラスタ 2 のデータに似せて作成しました。GMM を使用してトレーニングを行った後、どうにかして新しいテスト データのラベルを予測できますか? 各クラスの予測について、(p1 = 18%、p2 = 80%、p3 = 2%) のような確率を出すことは可能ですか。p2=80% を得たので、新しいテスト データがクラスター 2 としてラベル付けされるというハード分類を行うことができます。

ps: この投稿を見つけましたが、私には理論的なようです(同様の投稿)。できれば、返信に簡単な Matlab スクリプトをいくつか入れてください。

どうもありがとう。A.


編集:

Amro が問題の解決策を回答したので、さらに質問があります。

  1. 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);
    

    アムロが得たものは以下のようなものです

    アムロの結果

    これは、ラベル付けされたクラスター 1 と、クラスター 1 の一部と混合されたクラスター 2 を分離するため、私のデータには適していない可能性があります。これは私が避けようとしているものです。

    ここで提示するのは人工的な数値例です。ただし、私の実際のアプリケーションでは、画像のセグメンテーションの問題を処理します (たとえば、cluster1 が背景画像で、cluster2 が分離したいオブジェクトです)。次に、個別の GMM を個別のクラスに適合させるために何らかの方法で「強制」しようとします。2 つのクラスターが離れている場合 (たとえば、この例のクラスター 1 とクラスター 3)、アムロの方法を使用してすべてのデータを結合し、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);
    

    皆さんはどう思いますか?それともアムロの方法と同等ですか?もしそうなら、訓練されたGMMを強制的に分離する方法はありますか?

  2. また、関数を使用する理由について質問がありposteriorます。基本的に、GMM フィッティングを考慮して、テスト データの可能性を推定したいと考えています。では、なぜ今事後確率を計算するのでしょうか? それとも単なる命名の問題ですか (つまり、「事後確率」=「可能性」)?

  3. 私の知る限り、GMM は常に教師なしの方法として使用されてきました。GMM は k-means クラスタリングの確率バージョンであると誰かが私に言いました。そのような「監視された」スタイルで使用する資格はありますか? 推奨される論文や参考文献はありますか?

返信ありがとうございます。A.

4

1 に答える 1

3

事実上、1 つではなく 3 つの GMM モデルをトレーニングしました。それぞれが混合自体です。通常、複数のコンポーネントを含む 1 つの GMM を作成します。各コンポーネントはクラスターを表します...

したがって、私があなたの場合に行うことは、データセット全体 ( X1X2、およびX3) でトレーニングされた新しい GMM モデルを、3 つの GMM からのすべてのコンポーネントの合計に等しいコンポーネント数 (2+1+3 = 6ガウス混合) で作成することです。このモデルは、個別にトレーニングされたモデルのパラメーターを使用して初期化されます。

ここに説明するコードがあります(例で作成したのと同じ変数を使用しています):

% number of instances in each data subset
n1 = size(X1,1);
n2 = size(X2,1);
n3 = size(X3,1);

% the entire dataset
X = [X1; X2; X3];
n = n1 + n2 + n3;
k = k1 + k2 + k3;

% 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);

% display GMM density function over training data
line(X(:,1), X(:,2), 'LineStyle','none', ...
    'Marker','o', 'MarkerSize',1, 'Color','k')
hold on
ezcontour(@(x,y) pdf(gmm,[x y]), xlim(), ylim())
hold off
title(sprintf('GMM over %d training instances',n))

訓練済み_GMM


トレーニング データセット全体 (混合あり) で 1 つの GMM モデルをトレーニングしたk=6ので、それを使用して新しいデータ インスタンスをクラスター化できます。

cIdx = cluster(gmm, Xt1);

これは、コンポーネントの事後確率を手動で計算し、確率が最大のコンポーネントをクラスター インデックスとして取得することと同じです。

pr = posterior(gmm, Xt1);
[~,cIdx] = max(pr,[],2);

予想どおり、テスト データのほぼ 95% が同じコンポーネントに属するものとしてクラスター化されました。

>> tabulate(cIdx)
  Value    Count   Percent
      1       27      4.50%
      2        0      0.00%
      3      573     95.50%

一致するガウス パラメータは次のとおりです。

>> idx = 3;
>> gmm.mu(idx,:)
ans =
    5.7779    4.1731
>> gmm.Sigma(:,:,idx)
ans =
    2.9504    0.0801
    0.0801    4.0907

これは確かに、前の図の右上のコンポーネントに対応しています。

同様に、他のコンポーネントを調べると、前のコンポーネントidx=1のすぐ左側にあるコンポーネントになります。これは、600 個のテスト インスタンスのうち 27 個が「誤分類」されたことを説明しています... GMM がそれらにどの程度自信を持っていたかを示します。インスタンス:

>> pr(cIdx==1,:)
ans =
    0.9813    0.0001    0.0186    0.0000    0.0000    0.0000
    0.6926    0.0000    0.3074    0.0000    0.0000    0.0000
    0.5069    0.0000    0.4931    0.0000    0.0000    0.0000
    0.6904    0.0018    0.3078    0.0000    0.0000    0.0000
    0.6954    0.0000    0.3046    0.0000    0.0000    0.0000
    <... output truncated ...>
    0.5077    0.0000    0.4923    0.0000    0.0000    0.0000
    0.6859    0.0001    0.3141    0.0000    0.0000    0.0000
    0.8481    0.0000    0.1519    0.0000    0.0000    0.0000

前の図の上に重ねて表示されたテスト インスタンスは次のとおりです。

hold on
gscatter(Xt1(:,1), Xt1(:,2), cIdx)
hold off
title('clustered test instances')

clustered_test_data


編集:

上記の例は、データのクラスタリング (教師なし学習) に GMM を使用する方法を示すことを目的としていました。私が今理解していることから、代わりに必要なのは、既存のトレーニング済みモデル (教師あり学習) を使用してデータを分類することです。「クラスター」という用語の使用に混乱したと思います:)

とにかく、今は簡単なはずです。各モデルを使用してテスト データのクラス条件付き確率密度関数を計算し、最も可能性の高いモデルをクラス ラベルとして選択するだけです (モデルを 1 つに結合する必要はありません)。

したがって、最初のコードを続けると、次のようになります。

p = [pdf(gm1,Xt), pdf(gm2,Xt), pdf(gm3,Xt)];    % P(x|model_i)
[,cIdx] = max(p,[],2);                          % argmax_i P(x|model_i)

cIdxテスト データ内の各インスタンスのクラス予測 (1、2、または 3) です。

于 2014-10-08T23:35:18.813 に答える