Comprender el concepto de los Modelos de Mezcla Gaussianos


Estoy tratando de entender GMM leyendo las fuentes disponibles en línea. He logrado clustering usando K-Means y estaba viendo cómo GMM se compararía con K-means.

Esto es lo que he entendido, por favor hágamelo saber si mi concepto está equivocado:{[12]]}

GMM es como KNN, en el sentido de que la agrupación se logra en ambos casos. Pero en GMM cada cluster tiene su propia media independiente y covarianza. Además, k-means realiza asignaciones difíciles de puntos de datos a clústeres, mientras que en GMM obtenemos una colección de distribuciones gaussianas independientes, y para cada punto de datos tenemos una probabilidad de que pertenezca a una de las distribuciones.

Para entenderlo mejor he utilizado MatLab para codificarlo y lograr la agrupación deseada. He utilizado SIFT features con el propósito de extracción de características. Y han utilizado k-means clustering para inicializar los valores. (Esto es de la documentación 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);

Basado en lo anterior tengo means, covariances y priors. Mi pregunta principal es, ¿ahora qué? Estoy un poco perdido ahora.

También el means, covariances los vectores son cada uno del tamaño 128 x 50. Esperaba que fueran 1 x 50 ya que cada columna es un clúster, ¿no tendrá cada clúster solo una media y covarianza? (Sé que 128 son las características del TAMIZ, pero esperaba medios y covarianzas).

En k-means usé el comando MatLab knnsearch(X,Y) que básicamente encuentra el vecino más cercano en X para cada punto en Y.

Entonces, ¿cómo lograr esto en GMM, sé que es una colección de probabilidades, y por supuesto el partido más cercano de esa probabilidad será nuestro grupo ganador. Y aquí es donde estoy confundido. Todos los tutoriales en línea han enseñado cómo lograr el means, covariances valores, pero no dicen mucho sobre cómo usarlos en términos de agrupación.

Gracias

Author: StuckInPhD, 2014-09-24

3 answers

Creo que ayudaría si primero miras lo que representa un modelo GMM. Usaré funciones de la Caja de herramientas de estadísticas , pero usted debería poder hacer lo mismo usando VLFeat.

Comencemos con el caso de una mezcla de dos distribuciones normales 1-dimensionales . Cada gaussiano está representado por un par de media y varianza. La mezcla asigna un peso a cada componente (anterior).

Por ejemplo, permite mezcle dos distribuciones normales con pesos iguales (p = [0.5; 0.5]), la primera centrada en 0 y la segunda en 5 (mu = [0; 5]), y las varianzas iguales a 1 y 2 respectivamente para la primera y segunda distribuciones (sigma = cat(3, 1, 2)).

Como puede ver a continuación, la media cambia efectivamente la distribución, mientras que la varianza determina qué tan ancha/estrecha y plana/puntiaguda es. El anterior establece las proporciones de mezcla para obtener el modelo combinado final.

% 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-mezclas de gaussianas 1D

La idea de EM clustering es que cada distribución representa un clúster. Así que en el ejemplo anterior con datos unidimensionales, si se le diera una instancia x = 0.5, la asignaríamos como perteneciente al primer clúster/modo con 99.5% de probabilidad

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

Puede ver cómo la instancia cae bien por debajo de la primera curva de campana. Mientras que si se toma un punto en el medio, la respuesta sería más ambigua (punto asignado a la clase=2 pero con mucha menos certeza):

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

Lo mismo los conceptos se extienden a una dimensión superior con distribuciones normales multivariantes. En más de una dimensión, la matriz de covarianza es una generalización de varianza, con el fin de tener en cuenta las interdependencias entre entidades.

Aquí hay un ejemplo de nuevo con una mezcla de dos distribuciones MVN en 2 dimensiones:

% 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-mezclas de gaussianas 2D

Hay cierta intuición detrás de cómo la matriz de covarianza afecta la forma de la función de densidad de la articulación. Para instancia en 2D, si la matriz es diagonal implica que las dos dimensiones no co-varían. En ese caso, el PDF se vería como una elipse alineada con el eje estirada horizontal o verticalmente de acuerdo con la dimensión que tiene la varianza más grande. Si son iguales, entonces la forma es un círculo perfecto (distribución extendida en ambas dimensiones a una tasa igual). Finalmente, si la matriz de covarianza es arbitraria (no diagonal pero aún simétrica por definición), entonces probablemente se verá como una elipse estirada girada en algún ángulo.

Así que en la figura anterior, debería ser capaz de distinguir los dos "baches" y qué distribución individual representan cada uno. Cuando vayas a dimensiones 3D y superiores, piensa en el it como representando (hiper-)elipsoides en N-dims.

matriz de covarianza 2d


Ahora cuando se está realizando clustering utilizando GMM, el objetivo es encontrar los parámetros del modelo (media y covarianza de cada distribución, así como la antecedentes) para que el modelo resultante se ajuste mejor a los datos. La estimación de mejor ajuste se traduce en maximizando la probabilidad de los datos dados el modelo GMM (lo que significa que elige el modelo que maximiza Pr(data|model)).

Como otros han explicado, esto se resuelve iterativamente usando el algoritmo EM; EM comienza con una estimación inicial o conjetura de los parámetros del modelo de mezcla. Iterativamente re-puntúa las instancias de datos contra la densidad de mezcla producida por el parámetros. Las instancias re-puntuadas se utilizan para actualizar las estimaciones de parámetros. Esto se repite hasta que el algoritmo converge.

Desafortunadamente, el algoritmo EM es muy sensible a la inicialización del modelo, por lo que podría tomar mucho tiempo converger si establece valores iniciales pobres, o incluso quedarse atascado en local optima. Una mejor manera de iniciar los parámetros GMM es usar K-means como primer paso (como has mostrado en tu código), y usando la media / cov de esos clusters para inicializar EM.

Al igual que con otras técnicas de análisis de clústeres, primero necesitamos decidir el número de clústeres a utilizar. La validación cruzada es una forma sólida de encontrar una buena estimación del número de clusters.

EM clustering sufre del hecho de que hay muchos parámetros para encajar, y generalmente requiere muchos datos y muchas iteraciones para obtener buenos resultados. Un modelo sin restricciones con mezclas M y datos dimensionales D implica el ajuste D*D*M + D*M + M parámetros (M matrices de covarianza cada una de tamaño DxD, más M vectores medios de longitud D, más un vector de priores de longitud M). Eso podría ser un problema para conjuntos de datos con gran número de dimensiones. Por lo tanto, es costumbre imponer restricciones y suposiciones para simplificar el problema (una especie de regularización para evitar problemas de sobreajuste). Por ejemplo, podría fijar la matriz de covarianza para que sea solo diagonal o incluso tener las matrices de covarianza compartido entre todos los gaussianos.

Finalmente, una vez que haya ajustado el modelo de mezcla, puede explorar los clústeres computando la probabilidad posterior de las instancias de datos utilizando cada componente de mezcla (como he mostrado con el ejemplo 1D). GMM asigna cada instancia a un clúster de acuerdo con esta probabilidad de "pertenencia".


Aquí hay un ejemplo más completo de clustering de datos usando modelos de mezcla gaussianos:

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

Clustering EM

 59
Author: Amro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-27 00:23:30

Tienes razón, hay la misma idea detrás de la agrupación con K-Means o GMM. Pero como mencionaste Mezclas gaussianas tomar covarianzas de datos en cuenta. Para encontrar los parámetros de máxima verosimilitud (o MAPA máximo a posteriori) del modelo estadístico GMM, debe usar un proceso iterativo llamado algoritmo EM . Cada iteración se compone de un paso E (Expectativa) y un paso M (Maximización) y se repite hasta la convergencia. Después de la convergencia se puede estimar fácilmente la probabilidades de pertenencia de cada vector de datos para cada modelo de clúster.

 3
Author: Eric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-24 15:37:33

La covarianza le dice cómo varían los datos en el espacio, si una distribución tiene una covarianza grande, eso significa que los datos están más dispersos y viceversa. Cuando tiene el PDF de una distribución gaussiana (parámetros de media y covarianza), puede verificar la confianza de membresía de un punto de prueba bajo esa distribución.

Sin embargo GMM también sufre de la debilidad de K-Means, que tiene que elegir el parámetro K que es el número de clusters. Esto requiere una buena comprensión de sus datos multimodalidad.

 2
Author: Taygun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-24 16:48:48