20

Sto cercando di capire GMM leggendo le fonti disponibili online. Ho raggiunto il clustering usando K-Means e stavo vedendo come GMM si sarebbe paragonato a K-means.Comprensione del concetto di modelli di miscela gaussiana

Ecco quello che ho capito, per favore fatemelo sapere se il mio concetto è sbagliato:

GMM è come KNN, nel senso che il clustering è ottenuta in entrambi i casi. Ma in GMM ogni cluster ha il proprio significato indipendente e covarianza. Inoltre k-means esegue assegnazioni complesse di punti dati a cluster mentre in GMM otteniamo una raccolta di distribuzioni gaussiane indipendenti, e per ogni punto di dati è probabile che appartenga a una delle distribuzioni.

Per capirlo meglio ho usato MatLab per codificarlo e ottenere il cluster desiderato. Ho usato le funzionalità SIFT per l'estrazione di feature. E ho usato k-means clustering per inizializzare i valori. (Questo è dalla documentazione 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); 

Sulla base di quanto sopra ho means, covariances e priors. La mia domanda principale è, e adesso? Sono un po 'perso ora.

Anche i vettori means, covariances hanno ciascuna la dimensione 128 x 50. Mi aspettavo che fossero 1 x 50 poiché ogni colonna è un cluster, non ogni cluster ha solo una media e covarianza? (So ​​che 128 sono le funzionalità SIFT ma mi aspettavo mezzi e covarianze).

In k-means ho usato il comando della MatLab knnsearch(X,Y) che trova fondamentalmente il vicino più prossimo in X per ogni punto in Y.

Così come raggiungere questo obiettivo in GMM, so che è una collezione di probabilità, e naturalmente la partita più vicina da quella probabilità sarà il nostro gruppo vincente. Ed è qui che sono confuso. Tutti i tutorial online hanno insegnato come ottenere i valori means, covariances, ma non dire molto su come usarli effettivamente in termini di clustering.

Grazie

+1

Nota a margine: Penso che si sta confondendo [K-Means] (https: // en.wikipedia.org/wiki/K-means_clustering) e [kNN] (https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm) (K-neighbor neighbor). Il primo è un metodo di clustering (apprendimento non supervisionato), il secondo è un metodo di classificazione (apprendimento supervisionato). – Amro

+0

Il concetto è lo stesso con la verifica degli altoparlanti GMM UBM? –

risposta

55

Penso che sarebbe di aiuto se si guarda prima a ciò che rappresenta un modello GMM.Userò functions da Statistics Toolbox, ma dovresti essere in grado di fare lo stesso usando VLFeat.

Iniziamo con il caso di una miscela di due normal distributions 1-dimensionale. Ogni gaussiana è rappresentata da una coppia di mean e variance. La miscela assegna un peso a ciascun componente (precedente).

Ad esempio, immobili miscela due distribuzioni normali con pesi uguali (p = [0.5; 0.5]), il primo centrati a 0 e il secondo a 5 (mu = [0; 5]), e le varianze EQUAL 1 e 2 rispettivamente per il primo e secondo distribuzioni (sigma = cat(3, 1, 2)) .

Come potete vedere di seguito, la media sposta efficacemente la distribuzione, mentre la varianza determina quanto è larga/stretta e piatta/a punta. Il precedente imposta le proporzioni di miscelazione per ottenere il modello combinato finale.

% 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

L'idea di EM clustering è che ogni distribuzione rappresenta un cluster. Così, nell'esempio di cui sopra con uno dei dati dimensionali, se si fosse dato un esempio x = 0.5, avremmo assegnarlo come appartenente alla prima/modalità cluster con il 99,5% di probabilità

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

si può vedere come l'istanza cade ben al di sotto la prima curva a campana. Mentre se si prende un punto nel mezzo, la risposta sarebbe più ambigua (punto assegnato alla class = 2 ma con molto meno certezza):

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

Gli stessi concetti si estendono a dimensione superiore con multivariate normal distributions. In più di una dimensione, lo covariance matrix è una generalizzazione della varianza, per tenere conto delle interdipendenze tra le funzioni.

Ecco ancora un esempio con una miscela di due distribuzioni MVN in 2-dimensioni:

% 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

C'è qualche intuizione dietro come la matrice covarianza influisce sulla forma della densità congiunta funzione. Ad esempio in 2D, se la matrice è diagonale implica che le due dimensioni non co-variano. In tal caso, il PDF sembrerebbe un'ellisse allineata sull'asse tesa orizzontalmente o verticalmente a seconda della dimensione che ha la varianza maggiore. Se sono uguali, la forma è un cerchio perfetto (distribuzione distribuita in entrambe le dimensioni ad un tasso uguale). Infine se la matrice di covarianza è arbitraria (non diagonale ma ancora simmetrica per definizione), allora probabilmente sembrerà un'ellisse tesa ruotata con una certa angolazione.

Quindi nella figura precedente dovresti essere in grado di distinguere i due "dossi" e quale distribuzione individuale rappresentano ciascuno. Quando vai in 3D e dimensioni superiori, pensa a come rappresenta (iper-) ellipsoids in N-dims.

2d covariance matrix


Ora, quando si sta eseguendo clustering utilizzando GMM, l'obiettivo è quello di trovare i parametri del modello (media e covarianza di ogni distribuzione, così come i priori) in modo che i risultanti modello meglio si adatta i dati. La stima più adatta si traduce in maximizing the likelihood dei dati forniti dal modello GMM (ovvero si sceglie il modello che massimizza lo Pr(data|model)).

Come altri hanno spiegato, questo è risolto iterativamente utilizzando EM algorithm; EM inizia con una stima iniziale o l'ipotesi dei parametri del modello di miscela. Ripete iterativamente le istanze dei dati rispetto alla densità della miscela prodotta dai parametri. Le istanze re-valutate vengono quindi utilizzate per aggiornare le stime dei parametri. Questo viene ripetuto fino a quando l'algoritmo converge.

Sfortunatamente l'algoritmo EM è molto sensibile all'inizializzazione del modello, quindi potrebbe essere necessario molto tempo per convergere se si impostano valori iniziali poveri o si rimane bloccati in local optima. Un modo migliore per inizializzare i parametri GMM è usare K-means come primo passo (come quello che hai mostrato nel tuo codice) e usare la media/cov di quei cluster per inizializzare EM.

Come con altre tecniche di analisi del cluster, è necessario prima di utilizzare decide on the number of clusters. Cross-validation è un modo efficace per trovare una buona stima del numero di cluster.

Il clustering EM soffre del fatto che ci sono molti parametri per adattarsi e di solito richiede molti dati e molte iterazioni per ottenere buoni risultati. Un modello non vincolato con miscele M e dati D-dimensionali comporta l'adattamento dei parametri D*D*M + D*M + M (moci di covarianza M ciascuna di dimensione DxD, oltre a vettori medi M di lunghezza D, più un vettore di priori di lunghezza M). Questo potrebbe essere un problema per i set di dati con large number of dimensions. Quindi è consuetudine imporre restrizioni e presupposti per semplificare il problema (una sorta di regularization per evitare problemi overfitting). Ad esempio, è possibile correggere la matrice di covarianza in modo che sia solo diagonale o che abbia anche le matrici di covarianza shared tra tutti i gaussiani.

Infine, una volta installato il modello di miscela, è possibile esplorare i cluster calcolando la probabilità a posteriori delle istanze di dati utilizzando ciascun componente di miscela (come ho mostrato con l'esempio 1D). GMM assegna ciascuna istanza a un cluster in base a questa probabilità di "appartenenza".


Ecco un esempio più completo dei dati di clustering utilizzando modelli mistura gaussiano:

% 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

Come al solito, una risposta sorprendente! – Oleg

+1

O.o Quando i "pro" di stackoverflow danno la migliore spiegazione di qualcosa che può essere trovato nell'intero Internet. Solo wow. +1 –

+0

Grazie Amro, questo è molto più di quanto speravo. Sono sicuro che molti altri trarranno beneficio dalla tua risposta dettagliata come ho :) – StuckInPhD

3

Hai ragione, c'è la stessa intuizione dietro il clustering con K-Means o GMM. Ma come hai menzionato le Miscele Gaussiane, prendi in considerazione le covarianze dei dati. Per trovare i parametri di massima verosimiglianza (o MAP massima a posteriori) del modello statistico GMM, è necessario utilizzare un processo iterativo denominato EM algorithm. Ogni iterazione è composta da un E-step (Expectation) e un M-step (Massimizzazione) e si ripetono fino alla convergenza. Dopo la convergenza è possibile stimare facilmente le probabilità di appartenenza di ciascun vettore di dati per ciascun modello di cluster.

+0

Grazie per la risposta. Per ottenere i parametri MAP (media, covarianze, priori) devo eseguire EM? Ma pensavo di averlo già fatto nel mio codice: ''% Esegui EM a partire dai parametri dati [significa, covarianze, priors, ll, posteriors] = vl_gmm (double (all_feats), numClusters, ... '' is questo non è ciò che è necessario? – StuckInPhD

+0

Non conosco la funzione v1_gmm ma sembra che esegua EM dall'inizializzazione di kmeas.Quindi per ottenere il clustering è possibile stimare l'appartenenza a ciascun vettore di dati in ciascuna distribuzione gaussiana. Nota che come menzionato da @Taygun, il numero di cluster è un parametro degli algoritmi di kmea. Tuttavia esistono alcune estensioni come Clustering adattivo K-Means ... – Eric

2

Covariance indica in che modo i dati variano nello spazio, se una distribuzione ha una grande covarianza, il che significa che i dati sono più diffusi e viceversa. Quando si ha il PDF di una distribuzione gaussiana (parametri di media e covarianza), è possibile verificare la confidenza di appartenenza di un punto di prova in tale distribuzione.

Tuttavia GMM soffre anche della debolezza di K-Means, che devi selezionare il parametro K che è il numero di cluster. Ciò richiede una buona comprensione della multimodalità dei tuoi dati.