J'essaie de comprendre GMM en lisant les sources disponibles en ligne. J'ai réalisé un clustering en utilisant K-Means et je voyais comment GMM se comparerait à K-means.
Voici ce que j'ai compris, faites-moi savoir si mon concept est erroné:
GMM est comme KNN, dans le sens où le clustering est réalisé dans les deux cas. Mais dans GMM, chaque cluster a sa propre moyenne et covariance indépendante. De plus, k-means effectue des affectations difficiles de points de données aux clusters alors que dans GMM, nous obtenons une collection de distributions gaussiennes indépendantes, et pour chaque point de données, nous avons une probabilité d'appartenir à l'une des distributions.
Pour mieux le comprendre, j'ai utilisé MatLab pour le coder et obtenir le clustering souhaité. J'ai utilisé des fonctionnalités SIFT à des fins d'extraction de fonctionnalités. Et ont utilisé le clustering k-means pour initialiser les valeurs. (Ceci provient de la documentation 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);
Sur la base de ce qui précède, j'ai means
, covariances
et priors
. Ma principale question est: Et maintenant? Je suis un peu perdu maintenant.
Les vecteurs means
, covariances
sont également de la taille 128 x 50
. Je m'attendais à ce qu'ils soient 1 x 50
Puisque chaque colonne est un cluster, chaque cluster n'aura-t-il qu'une seule moyenne et covariance? (Je sais que 128 sont les fonctionnalités SIFT mais je m'attendais à des moyens et des covariances).
Dans k-means, j'ai utilisé la commande MatLab knnsearch(X,Y)
qui trouve essentiellement le plus proche voisin dans X pour chaque point de Y.
Alors, comment y parvenir dans GMM, je sais que c'est une collection de probabilités, et bien sûr, la correspondance la plus proche de cette probabilité sera notre cluster gagnant. Et c'est là que je suis confus. Tous les didacticiels en ligne ont enseigné comment atteindre les valeurs means
, covariances
, mais ne disent pas grand-chose sur la façon de les utiliser réellement en termes de clustering.
Je vous remercie
Je pense que cela aiderait si vous regardez d'abord ce que représente un modèle GMM . J'utiliserai fonctions de la Statistics Toolbox , mais vous devriez pouvoir faire de même en utilisant VLFeat.
Commençons par le cas d'un mélange de deux 1 dimensions distributions normales . Chaque gaussien est représenté par une paire de moyenne et variance . Le mélange attribue un poids à chaque composant (avant).
Par exemple, permet de mélanger deux distributions normales avec des poids égaux (p = [0.5; 0.5]
), La première centrée sur 0 et la seconde sur 5 (mu = [0; 5]
), Et les variances égales à 1 et 2 respectivement pour la première et deuxièmes distributions (sigma = cat(3, 1, 2)
).
Comme vous pouvez le voir ci-dessous, la moyenne déplace effectivement la distribution, tandis que la variance détermine à quel point elle est large/étroite et plate/pointue. L'avant définit les proportions de mélange pour obtenir le modèle combiné 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));
L'idée de EM clustering est que chaque distribution représente un cluster. Donc, dans l'exemple ci-dessus avec des données unidimensionnelles, si on vous donnait une instance x = 0.5
, Nous l'attribuerions comme appartenant au premier cluster/mode avec une probabilité de 99,5%
>> x = 0.5;
>> posterior(gmm, x)
ans =
0.9950 0.0050 % probability x came from each component
vous pouvez voir comment l'instance tombe bien sous la première courbe en cloche. Alors que si vous prenez un point au milieu, la réponse serait plus ambiguë (point attribué à la classe = 2 mais avec beaucoup moins de certitude):
>> x = 2.2
>> posterior(gmm, 2.2)
ans =
0.4717 0.5283
Les mêmes concepts s'étendent à une dimension supérieure avec distributions normales multivariées . Dans plus d'une dimension, la matrice de covariance est une généralisation de la variance, afin de tenir compte des interdépendances entre les caractéristiques.
Voici à nouveau un exemple avec un mélange de deux distributions MVN en 2 dimensions:
% 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]));
Il y a une certaine intuition derrière la façon dont la matrice de covariance affecte la forme de la fonction de densité conjointe. Par exemple en 2D, si la matrice est diagonale, cela implique que les deux dimensions ne co-varient pas. Dans ce cas, le PDF ressemblerait à une ellipse alignée sur l'axe étirée horizontalement ou verticalement selon la dimension qui présente la plus grande variance. S'ils sont égaux, alors la forme est un cercle parfait ( Enfin, si la matrice de covariance est arbitraire (non diagonale mais toujours symétrique par définition), elle ressemblera probablement à une ellipse étirée tournée sous un certain angle.
Ainsi, dans la figure précédente, vous devriez pouvoir distinguer les deux "bosses" et quelle distribution individuelle chacune représente. Lorsque vous optez pour des dimensions 3D et supérieures, pensez-y comme représentant (hyper -) ellipsoïdes en N-dims.
Maintenant, lorsque vous effectuez clustering en utilisant GMM, le but est de trouver les paramètres du modèle (moyenne et covariance de chaque distribution ainsi que les a priori) afin que le modèle résultant corresponde le mieux aux données. L'estimation du meilleur ajustement se traduit par maximisation de la vraisemblance des données compte tenu du modèle GMM (ce qui signifie que vous choisissez un modèle qui maximise Pr(data|model)
).
Comme d'autres l'ont expliqué, ceci est résolu de manière itérative en utilisant algorithme EM ; EM commence par une estimation initiale ou une estimation des paramètres du modèle de mélange. Il réévalue de manière itérative les instances de données en fonction de la densité de mélange produite par les paramètres. Les instances recalculées sont ensuite utilisées pour mettre à jour les estimations des paramètres. Ceci est répété jusqu'à ce que l'algorithme converge.
Malheureusement, l'algorithme EM est très sensible à l'initialisation du modèle, il peut donc prendre beaucoup de temps pour converger si vous définissez des valeurs initiales médiocres, ou même coincé dans optima local . Une meilleure façon d'initialiser les paramètres GMM est d'utiliser K-means comme première étape (comme vous l'avez montré dans votre code), et d'utiliser la moyenne/cov de ces clusters pour initialiser EM.
Comme pour les autres techniques d'analyse de grappes, nous devons d'abord décider du nombre de grappes à utiliser. Validation croisée est un moyen robuste de trouver une bonne estimation du nombre de grappes.
Le clustering EM souffre du fait qu'il y a beaucoup de paramètres à ajuster et nécessite généralement beaucoup de données et de nombreuses itérations pour obtenir de bons résultats. Un modèle non contraint avec des mélanges M et des données de dimension D implique l'ajustement des paramètres D*D*M + D*M + M
(M matrices de covariance chacune de taille DxD, plus M vecteurs moyens de longueur D, plus un vecteur de prieurs de longueur M). Cela pourrait être un problème pour les jeux de données avec grand nombre de dimensions . Il est donc d'usage d'imposer des restrictions et des hypothèses pour simplifier le problème (une sorte de régularisation pour éviter sur-ajustement problèmes). Par exemple, vous pouvez fixer la matrice de covariance pour qu'elle ne soit que diagonale ou même avoir les matrices de covariance partagée pour tous les Gaussiens.
Enfin, une fois que vous avez ajusté le modèle de mélange, vous pouvez explorer les clusters en calculant la probabilité postérieure d'instances de données en utilisant chaque composant de mélange (comme je l'ai montré avec l'exemple 1D). GMM attribue chaque instance à un cluster en fonction de cette probabilité "d'appartenance".
Voici un exemple plus complet de regroupement de données à l'aide de modèles de mélange gaussiens:
% 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')
Vous avez raison, il y a le même aperçu du clustering avec K-Means ou GMM. Mais comme vous l'avez mentionné, les mélanges gaussiens tiennent compte des covariances de données. Pour trouver les paramètres de vraisemblance maximale (ou MAP maximale a posteriori) du modèle statistique GMM, vous devez utiliser un processus itératif appelé algorithme EM . Chaque itération est composée d'une étape E (attente) et d'une étape M (maximisation) et se répète jusqu'à convergence. Après la convergence, vous pouvez facilement estimer les probabilités d'appartenance de chaque vecteur de données pour chaque modèle de cluster.
La covariance vous indique comment les données varient dans l'espace, si une distribution a une grande covariance, cela signifie que les données sont plus réparties et vice versa. Lorsque vous avez le PDF d'une distribution gaussienne (paramètres de moyenne et de covariance), vous pouvez vérifier la confiance d'appartenance d'un point de test sous cette distribution.
Mais GMM souffre également de la faiblesse des K-Means, il faut choisir le paramètre K qui est le nombre de clusters. Cela nécessite une bonne compréhension de la multimodalité de vos données.