20

我想通過閱讀在線可用來源瞭解GMM。我已經使用K-Means實現了聚類,並且看到GMM如何與K-means相比較。瞭解高斯混合模型的概念

以下是我也明白了,請讓我知道,如果我的觀念是錯誤的:

GMM就像KNN,在聚類在這兩種情況下取​​得的感覺。但是在GMM中,每個羣都有自己的獨立均值和協方差。此外,k-means執行數據點到簇的硬分配,而在GMM中,我們得到一組獨立的高斯分佈,並且對於每個數據點,我們有它屬於其中一個分佈的概率。

爲了更好地理解它,我使用了MatLab來對它進行編碼並實現所需的羣集。我已經使用SIFT特徵來進行特徵提取。並使用k-means聚類來初始化值。 (這是從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); 

基於上述我有meanscovariancespriors和。我的主要問題是,現在是什麼?我現在有點迷路了。

也是means,covariances載體的尺寸分別爲128 x 50。我期待他們是1 x 50,因爲每一列是一個集羣,不會每個集羣只有一個均值和協方差? (我知道128是SIFT的功能,但我期待的手段和協方差)。

在k均值我用MATLAB命令knnsearch(X,Y)基本上找到最近的鄰居X每個點Y.

那麼如何在GMM實現這一目標,我知道它的概率的集合,當然,與該概率最接近的匹配將是我們的獲勝集羣。這就是我困惑的地方。 所有在線教程都告訴我們如何實現means,covariances的值,但不要多說如何在集羣方面實際使用它們。

謝謝

+1

附註:我想你混淆了[K均值(https://開頭en.wikipedia.org/wiki/K-means_clustering)和[kNN](https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm)(K-nearest neighbor)。第一種是聚類方法(無監督學習),第二種是分類方法(監督學習)。 – Amro 2014-09-26 19:07:28

+0

該概念與GMM UBM說話者驗證是否相同? – 2016-10-22 07:26:37

回答

55

我認爲這將有助於你首先看看GMM模型代表什麼。我將使用Statistics Toolbox中的functions,但您應該可以使用VLFeat做到這一點。

讓我們從兩個1維normal distributions的混合物的情況開始。每個高斯由一對meanvariance表示。混合物爲每個組分分配一個重量(之前)。

例如,讓混合兩個正態分佈具有相等的權重(p = [0.5; 0.5])中,在0與第一中心和第二個爲5(mu = [0; 5])和方差分別等於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)); 

2-mixtures of 1D gaussians

EM clustering的想法是,每一個分佈表示一個羣集。因此,在上面一個維數據的例子,如果給你一個實例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 

相同的概念擴展到更高的層面與multivariate normal distributions。在多個維度中,covariance matrix是方差的泛化,以說明要素之間的相互依賴關係。

這裏再次是示例具有兩個MVN分佈在2維的混合物:

% 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-mixtures of 2D gaussians

有背後的協方差矩陣如何影響聯合密度的形狀一些直覺功能。例如在2D中,如果矩陣是對角的,則意味着這兩個維度不會共同變化。在這種情況下,PDF將看起來像是一個軸對齊的橢圓,可以水平或垂直伸展,根據哪個維度具有較大的方差。如果它們相等,那麼形狀就是一個完美的圓形(分佈在兩個維度上以相等的比率分佈)。最後,如果協方差矩陣是任意的(非對角線但是仍然對稱),那麼它可能看起來像是以某個角度旋轉的拉伸橢圓。

所以在上圖中,您應該能夠區分兩個「顛簸」以及每個個體的分佈。當你去3D和更高維度時,把它看作代表(超)ellipsoids在N-dims中。

2d covariance matrix


現在,當你使用GMM執行clustering,我們的目標是找到模型參數(平均每個分佈以及先驗的協方差),這樣生成的模型最適合數據。最佳擬合估計轉化爲給定GMM模型的數據的maximizing the likelihood(意味着您選擇最大化Pr(data|model)的模型)。

正如其他人已經解釋,這是迭代使用EM algorithm; EM首先對混合模型的參數進行初始估計或猜測。它會根據參數產生的混合密度迭代重新計算數據實例。重新評分的實例隨後用於更新參數估計值。重複這個過程直到算法收斂。

不幸的是,EM算法對模型的初始化非常敏感,所以如果設置較差的初始值或甚至陷入local optima,則可能需要很長時間才能收斂。初始化GMM參數的一個更好的方法是使用K-means作爲第一步(就像你在代碼中顯示的那樣),並使用這些簇的均值/包絡來初始化EM。

與其他聚類分析技術一樣,我們首先需要使用decide on the number of clustersCross-validation是一個很好的方法來找到一個好的羣集數量估計。

EM集羣患有這樣一個事實,即有很多參數需要適應,並且通常需要大量數據和許多迭代才能獲得良好結果。具有M混合和D維數據的無約束模型包括擬合參數(M個協方差矩陣,每個矩陣大小爲D×D,加上M個長度爲D的平均矢量,加上長度爲M的先驗矢量)。這可能是large number of dimensions數據集的問題。所以習慣性地施加限制和假設來簡化問題(一種regularization以避免overfitting問題)。例如,您可以將協方差矩陣固定爲僅對角線,或者甚至可以將所有高斯矩陣中的協方差矩陣修正爲0.。

最後,一旦你已經擬合了混合模型,你可以通過計算使用每個混合組件的數據實例的後驗概率來探索簇(就像我已經用一維實例展示的那樣)。 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 clustering

+0

像往常一樣,一個驚人的答案! – Oleg 2014-09-29 07:38:15

+1

O.o當stackoverflow「專業」給出了可以在整個互聯網中找到的東西的最佳解釋。哇哇! +1 – 2014-09-29 11:20:14

+0

謝謝Amro,這比我希望的要多得多。我相信更多的人會從你的詳細答案中受益,因爲我有:) – StuckInPhD 2014-09-30 19:05:31

3

你是對的,背後有與K均值或GMM羣集相同的見解。但是,正如你所提到的高斯混合數據考慮到數據協方差。 要找到GMM統計模型的最大似然參數(或最大後驗MAP),您需要使用稱爲EM algorithm的迭代過程。每次迭代由E步驟(期望)和M步驟(最大化)組成,並重復,直至收斂。收斂後,您可以輕鬆估計每個聚類模型中每個數據向量的成員概率。

+0

謝謝你的回答。要獲得MAP參數(平均值,協方差,先驗),我必須運行EM?但我認爲我已經在我的代碼中完成了這個工作:'%Run EM從給定的參數 [means,covariances,priors,ll,posters] = vl_gmm(double(all_feats),numClusters,...''是這不是什麼要求? – StuckInPhD 2014-09-24 16:56:30

+0

我不知道v1_gmm函數,但它似乎從kmeans初始化運行EM。然後爲了獲得聚類,可以估計每個高斯分佈下每個數據向量的隸屬度。請注意,正如@Taygun所提到的,羣集數量是kmeans算法的一個參數。然而,它們存在一些擴展,如適應性K均值聚類... – Eric 2014-09-25 08:41:30

2

協方差會告訴您數據如何在空間中變化,如果分佈具有較大的協方差,這意味着數據更加分散,反之亦然。當您具有高斯分佈的PDF(平均值和協方差參數)時,您可以檢查該分佈下測試點的成員信心。

然而,GMM也遭受K-Means的弱點,你必須選擇參數K,這是簇的數量。這需要對您的數據的多種模式有一個很好的理解。