Ответ 1
Я думаю, что это поможет, если вы сначала посмотрите, что представляет собой модель GMM. Я буду использовать функции из Статистика Toolbox, но вы должны быть в состоянии сделать то же самое с помощью VLFeat.
Начнем со случая смеси двух одномерных нормальных распределений. Каждый гауссов представлен парой mean и variance. Смесь присваивает вес каждому компоненту (ранее).
Например, смешайте два нормальных распределения с равными весами (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));
Идея кластеризации EM заключается в том, что каждый дистрибутив представляет собой кластер. Итак, в приведенном выше примере с одномерными данными, если вам был предоставлен экземпляр 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
Те же понятия распространяются на более высокую размерность с многомерными нормальными распределениями. В более чем одном измерении матрица ковариации является обобщением дисперсии для учета взаимозависимостей между функциями.
Вот пример снова со смесью двух распределений MVN в двух измерениях:
% 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]));
Существует некоторая интуиция относительно того, как ковариационная матрица влияет на форму совместной плотности. Например, в 2D, если матрица диагональна, это означает, что оба измерения не меняются. В этом случае PDF будет выглядеть как выровненный по оси эллипс, растянутый либо по горизонтали, либо по вертикали, согласно которому размерность имеет большую дисперсию. Если они равны, то форма является идеальным кругом (распределение распределяется в обоих измерениях с равной скоростью). Наконец, если ковариационная матрица произвольна (недиагональная, но все еще симметричная по определению), то она, вероятно, будет выглядеть как растянутый эллипс, повернутый под некоторым углом.
Итак, на предыдущем рисунке вы должны быть в состоянии рассказать обо всех "ударах" и о том, какое индивидуальное распределение каждый представляет. Когда вы идете в 3D и более высокие измерения, подумайте об этом как о представлении (гипер-) эллипсоидов в N-dims.
Теперь, когда вы выполняете кластеризацию с использованием GMM, цель состоит в том, чтобы найти параметры модели (среднее значение и ковариацию каждого дистрибутива, а также приоритетов), чтобы результирующая модель лучше всего подходит для данных. Оценка наилучшего соответствия переводит в максимизацию вероятности данных, данных модели GMM (что означает, что вы выбираете модель, которая максимизирует Pr(data|model)
).
Как объяснили другие, это решается итеративно с помощью алгоритма EM; EM начинается с начальной оценки или догадки параметров модели смеси. Он итеративно переучитывает экземпляры данных против плотности смеси, создаваемой параметрами. Затем повторно используемые экземпляры используются для обновления оценок параметров. Это повторяется до тех пор, пока алгоритм не сходится.
К сожалению, алгоритм ЭМ очень чувствителен к инициализации модели, поэтому может потребоваться много времени, чтобы сходиться, если вы устанавливаете плохие начальные значения или даже застреваете в локальных оптимумах. Лучшим способом инициализации параметров GMM является использование K-means в качестве первого шага (например, вы указали в своем коде), и используя среднее значение /cov эти кластеры для инициализации EM.
Как и в случае других методов кластерного анализа, сначала нужно принять решение о количестве кластеров. Cross-validation - это надежный способ найти хорошую оценку количества кластеров.
Кластеризация EM страдает от того, что существует множество параметров, которые подходят, и обычно требуется много данных и много итераций для получения хороших результатов. Неконструированная модель с M-смесями и D-мерными данными включает в себя подгонку параметровD*D*M + D*M + M
(M ковариационных матриц каждого размера DxD, плюс M средних векторов длины D плюс вектор перьевых длин M). Это может быть проблемой для наборов данных с большим количеством измерений. Поэтому принято налагать ограничения и предположения для упрощения проблемы (своего рода regularization, чтобы избежать overfitting). Например, вы можете исправить матрицу ковариации только диагональной или даже иметь ковариационные матрицы совместно по всем гауссианам.
Наконец, как только вы установите модель смеси, вы можете исследовать кластеры, вычисляя заднюю вероятность экземпляров данных с использованием каждого компонента смеси (например, я показал пример 1D). 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')