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));
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]));
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.
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')
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
Il concetto è lo stesso con la verifica degli altoparlanti GMM UBM? –