ガウス混合モデルの概念を理解する 質問する

ガウス混合モデルの概念を理解する 質問する

私はオンラインで入手可能なソースを読んで GMM を理解しようとしています。K-Means を使用してクラスタリングを実現し、GMM と K-Means を比較してみました。

私が理解したことは次のとおりです。私の考えが間違っている場合はお知らせください。

GMM は、どちらの場合もクラスタリングが達成されるという点で KNN に似ています。ただし、GMM では、各クラスターに独立した平均と共分散があります。さらに、k-means はデータ ポイントをクラスターにハード割り当てしますが、GMM では独立したガウス分布のコレクションを取得し、各データ ポイントがいずれかの分布に属する確率を持ちます。

より理解を深めるために、私はMatLabを使ってコーディングし、望ましいクラスタリングを実現しました。特徴抽出のためにSIFT機能を使用しました。また、値を初期化するためにk平均クラスタリングを使用しました。(これはVLFeatドキュメンテーション)

%images is a 459 x 1 cell array where each cell contains the training image
[locations, all_feats] = vl_dsift(single(images{1}), 'fast', 'step', 50); %all_feats will be 128 x no. of keypoints detected
for i=2:(size(images,1))
    [locations, feats] = vl_dsift(single(images{i}), 'fast', 'step', 50);
    all_feats = cat(2, all_feats, feats); %cat column wise all features
end

numClusters = 50; %Just a random selection.
% Run KMeans to pre-cluster the data
[initMeans, assignments] = vl_kmeans(single(all_feats), numClusters, ...
    'Algorithm','Lloyd', ...
    'MaxNumIterations',5);

initMeans = double(initMeans); %GMM needs it to be double

% Find the initial means, covariances and priors
for i=1:numClusters
    data_k = all_feats(:,assignments==i);
    initPriors(i) = size(data_k,2) / numClusters;

    if size(data_k,1) == 0 || size(data_k,2) == 0
        initCovariances(:,i) = diag(cov(data'));
    else
        initCovariances(:,i) = double(diag(cov(double((data_k')))));
    end
end

% Run EM starting from the given parameters
[means,covariances,priors,ll,posteriors] = vl_gmm(double(all_feats), numClusters, ...
    'initialization','custom', ...
    'InitMeans',initMeans, ...
    'InitCovariances',initCovariances, ...
    'InitPriors',initPriors);

上記に基づいて、私はmeanscovariancesおよびを持っていますpriors。私の主な質問は、次に何をするかということです。私は今、少し迷っています。

またmeanscovariancesベクトルはそれぞれ のサイズです128 x 50。各列がクラスターなので になると予想していましたが1 x 50、各クラスターには 1 つの平均と共分散しかないのではないでしょうか? (128 が SIFT 機能であることは知っていますが、平均と共分散を予想していました)。

knnsearch(X,Y)k-means では、基本的に Y の各ポイントに対して X で最も近い近傍を検索するMatLab コマンドを使用しました。

では、これを GMM でどのように実現するのでしょうか。これは確率の集合であり、もちろんその確率に最も近い一致が勝利のクラスターになるのはわかっています。そして、ここが私が混乱しているところです。オンラインのすべてのチュートリアルでは、 、means値を実現する方法は説明されていcovariancesますが、クラスタリングに関して実際にどのように使用するかについてはあまり説明されていません。

ありがとう

ベストアンサー1

まず、グローバルモデルは表します。機能から統計ツールボックスただし、VLFeat を使用して同じことを実現できるはずです。

まず、2つの1次元の混合の場合から始めましょう。正規分布各ガウス分布は、平均そして分散混合物は各成分に重みを割り当てます(事前)。

たとえば、等しい重みを持つ 2 つの正規分布 ( p = [0.5; 0.5]) を混合すると、最初の分布の中心は 0、2 番目の分布の中心は 5 ( mu = [0; 5]) となり、最初の分布と 2 番目の分布の分散はそれぞれ 1 と 2 になります ( sigma = cat(3, 1, 2))。

以下に示すように、平均は分布を効果的にシフトし、分散は分布の広さ/狭さ、平坦さ/尖り具合を決定します。事前分布は、最終的な結合モデルを取得するための混合比率を設定します。

% create GMM
mu = [0; 5];
sigma = cat(3, 1, 2);
p = [0.5; 0.5];
gmm = gmdistribution(mu, sigma, p);

% view PDF
ezplot(@(x) pdf(gmm,x));

1Dガウス分布の2混合

の考え方EMクラスタリング各分布はクラスターを表すということです。したがって、1次元データを使用した上記の例では、インスタンスが与えられた場合x = 0.5、99.5%の確率で最初のクラスター/モードに属するものとして割り当てます。

>> x = 0.5;
>> posterior(gmm, x)
ans =
    0.9950    0.0050    % probability x came from each component

インスタンスが最初のベル曲線の下に収まっていることがわかります。一方、真ん中の点を取ると、答えはより曖昧になります (ポイントはクラス = 2 に割り当てられますが、確実性ははるかに低くなります)。

>> x = 2.2
>> posterior(gmm, 2.2)
ans =
    0.4717    0.5283

同じ概念は高次元にも拡張され、多変量正規分布複数の次元で、共分散行列特徴間の相互依存性を考慮するために、分散を一般化します。

2 次元の 2 つの MVN 分布が混在する例をもう一度示します。

% first distribution is centered at (0,0), second at (-1,3)
mu = [0 0; 3 3];

% covariance of first is identity matrix, second diagonal
sigma = cat(3, eye(2), [5 0; 0 1]);

% again I'm using equal priors
p = [0.5; 0.5];

% build GMM
gmm = gmdistribution(mu, sigma, p);

% 2D projection
ezcontourf(@(x,y) pdf(gmm,[x y]));

% view PDF surface
ezsurfc(@(x,y) pdf(gmm,[x y]));

2次元ガウス分布の2混合

共分散行列が結合密度関数の形状にどのように影響するかについては、ある程度の直感があります。たとえば、2D では、行列が対角である場合、2 つの次元が共変しないことを意味します。その場合、PDF は、どの次元の分散が大きいかに応じて、水平または垂直に引き伸ばされた軸に沿った楕円のように見えます。それらが等しい場合、形状は完全な円になります (分布は両方の次元に同じ割合で広がります)。最後に、共分散行列が任意 (非対角だが定義上は対称) である場合、それはおそらく、ある角度で回転した引き伸ばされた楕円のように見えるでしょう。

前の図では、2つの「隆起」を区別でき、それぞれがどのような分布を表しているかがわかるはずです。3D以上の高次元では、(超)楕円体N次元で。

2次元共分散行列


パフォーマンスをするときクラスタリングGMMを使用する場合、目標はモデルパラメータ(各分布の平均と共分散、事前分布)を見つけて、結果のモデルがデータに最も適合するようにすることです。最適な推定値は次のように変換されます。可能性を最大化するGMM モデルが与えられた場合のデータの (つまり、 を最大化するモデルを選択するPr(data|model))。

他の人が説明しているように、これはEMアルゴリズム; EM は、混合モデルのパラメータの初期推定値または推測値から始まります。パラメータによって生成された混合密度に対してデータ インスタンスを繰り返し再スコアリングします。再スコアリングされたインスタンスは、パラメータ推定値の更新に使用されます。これは、アルゴリズムが収束するまで繰り返されます。

残念ながら、EMアルゴリズムはモデルの初期化に非常に敏感なので、初期値を設定しないと収束に長い時間がかかったり、局所最適GMMパラメータを初期化するより良い方法は、K平均法最初のステップとして(コードで示したように)、それらのクラスターの平均/covを使用してEMを初期化します。

他のクラスター分析手法と同様に、まずクラスターの数を決定する使用する。クロス検証クラスターの数を適切に推定するための堅牢な方法です。

EMクラスタリングは、多くのパラメータを当てはめる必要があるという問題があり、良い結果を得るには大量のデータと多くの反復処理が必要になる。M混合とD次元データを持つ制約のないモデルでは、D*D*M + D*M + Mパラメータ(それぞれサイズDxDのM共分散行列、長さDの平均ベクトルM個、長さMの事前分布ベクトル)を当てはめる必要がある。これは、多数の次元そこで、問題を単純化するために制限や仮定を課すのが通例である(一種の正規化避けるために過剰適合問題)。例えば、共分散行列を対角行列のみに固定したり、共分散行列を共有すべてのガウス分布にわたって。

最後に、混合モデルを適合させたら、各混合コンポーネントを使用してデータ インスタンスの事後確率を計算することでクラスターを探索できます (1D の例で示したように)。GMM は、この「メンバーシップ」の尤度に従って各インスタンスをクラスターに割り当てます。


以下は、ガウス混合モデルを使用してデータをクラスタリングするより完全な例です。

% load Fisher Iris dataset
load fisheriris

% project it down to 2 dimensions for the sake of visualization
[~,data] = pca(meas,'NumComponents',2);
mn = min(data); mx = max(data);
D = size(data,2);    % data dimension    

% inital kmeans step used to initialize EM
K = 3;               % number of mixtures/clusters
cInd = kmeans(data, K, 'EmptyAction','singleton');

% fit a GMM model
gmm = fitgmdist(data, K, 'Options',statset('MaxIter',1000), ...
    'CovType','full', 'SharedCov',false, 'Regularize',0.01, 'Start',cInd);

% means, covariances, and mixing-weights
mu = gmm.mu;
sigma = gmm.Sigma;
p = gmm.PComponents;

% cluster and posterior probablity of each instance
% note that: [~,clustIdx] = max(p,[],2)
[clustInd,~,p] = cluster(gmm, data);
tabulate(clustInd)

% plot data, clustering of the entire domain, and the GMM contours
clrLite = [1 0.6 0.6 ; 0.6 1 0.6 ; 0.6 0.6 1];
clrDark = [0.7 0 0 ; 0 0.7 0 ; 0 0 0.7];
[X,Y] = meshgrid(linspace(mn(1),mx(1),50), linspace(mn(2),mx(2),50));
C = cluster(gmm, [X(:) Y(:)]);
image(X(:), Y(:), reshape(C,size(X))), hold on
gscatter(data(:,1), data(:,2), species, clrDark)
h = ezcontour(@(x,y)pdf(gmm,[x y]), [mn(1) mx(1) mn(2) mx(2)]);
set(h, 'LineColor','k', 'LineStyle',':')
hold off, axis xy, colormap(clrLite)
title('2D data and fitted GMM'), xlabel('PC1'), ylabel('PC2')

EMクラスタリング

おすすめ記事