Этот пример показывает, как определить лучшую подгонку Гауссовой модели смеси (GMM) путем корректировки количества компонентов и структуры ковариационной матрицы компонента.
Загрузите ирисовый набор данных Фишера. Рассмотрите лепестковые измерения как предикторы.
load fisheriris; X = meas(:,3:4); [n,p] = size(X); rng(1); % For reproducibility figure; plot(X(:,1),X(:,2),'.','MarkerSize',15); title('Fisher''s Iris Data Set'); xlabel('Petal length (cm)'); ylabel('Petal width (cm)');
Предположим, что k является количеством желаемых компонентов или кластеров, и является структурой ковариации для всех компонентов. Выполните эти шаги, чтобы настроить GMM.
Выберите (k), пара, и затем соответствуйте GMM использование выбранной спецификации параметра и целого набора данных.
Оцените AIC и BIC.
Повторите шаги 1 и 2, пока вы не исчерпаете весь (k), пары интереса.
Выберите подходящий GMM, который балансирует низкий AIC с простоты.
В данном примере выберите сетку значений для k, которые включают 2 и 3, и некоторые окружающие числа. Задайте весь доступный выбор для структуры ковариации. Если k слишком высок для набора данных, то предполагаемые ковариации компонента могут быть плохо обусловлены. Задайте, чтобы использовать регуляризацию, чтобы избежать плохо обусловленных ковариационных матриц. Увеличьте число итераций алгоритма EM к 10 000.
k = 1:5; nK = numel(k); Sigma = {'diagonal','full'}; nSigma = numel(Sigma); SharedCovariance = {true,false}; SCtext = {'true','false'}; nSC = numel(SharedCovariance); RegularizationValue = 0.01; options = statset('MaxIter',10000);
Соответствуйте GMMs, использующему всю комбинацию параметра. Вычислите AIC и BIC для каждой подгонки. Отследите терминальное состояние сходимости каждой подгонки.
% Preallocation gm = cell(nK,nSigma,nSC); aic = zeros(nK,nSigma,nSC); bic = zeros(nK,nSigma,nSC); converged = false(nK,nSigma,nSC); % Fit all models for m = 1:nSC; for j = 1:nSigma; for i = 1:nK; gm{i,j,m} = fitgmdist(X,k(i),... 'CovarianceType',Sigma{j},... 'SharedCovariance',SharedCovariance{m},... 'RegularizationValue',RegularizationValue,... 'Options',options); aic(i,j,m) = gm{i,j,m}.AIC; bic(i,j,m) = gm{i,j,m}.BIC; converged(i,j,m) = gm{i,j,m}.Converged; end end end allConverge = (sum(converged(:)) == nK*nSigma*nSC)
allConverge = logical 1
gm
является массивом ячеек, содержащим все подходящие объекты модели gmdistribution
. Все подходящие экземпляры сходились.
Постройте отдельные столбчатые диаграммы, чтобы сравнить AIC и BIC среди всех подгонок. Сгруппируйте панели k.
figure; bar(reshape(aic,nK,nSigma*nSC)); title('AIC For Various $k$ and $\Sigma$ Choices','Interpreter','latex'); xlabel('$k$','Interpreter','Latex'); ylabel('AIC'); legend({'Diagonal-shared','Full-shared','Diagonal-unshared',... 'Full-unshared'}); figure; bar(reshape(bic,nK,nSigma*nSC)); title('BIC For Various $k$ and $\Sigma$ Choices','Interpreter','latex'); xlabel('$c$','Interpreter','Latex'); ylabel('BIC'); legend({'Diagonal-shared','Full-shared','Diagonal-unshared',... 'Full-unshared'});
Согласно AIC и значениям BIC, лучшая модель имеет 3 компонента и полную, неразделенную структуру ковариационной матрицы.
Кластеризируйте данные тренировки с помощью модели оптимальной подгонки. Отобразите на графике кластеризованные данные и замещающие знаки компонента.
gmBest = gm{3,2,2}; clusterX = cluster(gmBest,X); kGMM = gmBest.NumComponents; d = 500; x1 = linspace(min(X(:,1)) - 2,max(X(:,1)) + 2,d); x2 = linspace(min(X(:,2)) - 2,max(X(:,2)) + 2,d); [x1grid,x2grid] = meshgrid(x1,x2); X0 = [x1grid(:) x2grid(:)]; mahalDist = mahal(gmBest,X0); threshold = sqrt(chi2inv(0.99,2)); figure; h1 = gscatter(X(:,1),X(:,2),clusterX); hold on; for j = 1:kGMM; idx = mahalDist(:,j)<=threshold; Color = h1(j).Color*0.75 + -0.5*(h1(j).Color - 1); h2 = plot(X0(idx,1),X0(idx,2),'.','Color',Color,'MarkerSize',1); uistack(h2,'bottom'); end h3 = plot(gmBest.mu(:,1),gmBest.mu(:,2),'kx','LineWidth',2,'MarkerSize',10); title('Clustered Data and Component Structures'); xlabel('Petal length (cm)'); ylabel('Petal width (cm)'); legend(h1,'Cluster 1','Cluster 2','Cluster 3','Location','NorthWest'); hold off
Этот набор данных включает метки. Определите, как хорошо gmBest
кластеризирует данные путем сравнения каждого прогноза с истинными метками.
species = categorical(species); Y = zeros(n,1); Y(species == 'versicolor') = 1; Y(species == 'virginica') = 2; Y(species == 'setosa') = 3; miscluster = Y ~= clusterX; clusterError = sum(miscluster)/n
clusterError = 0.0800
Оптимальная подгонка группы GMM 8% наблюдений в неправильный кластер.
cluster
не всегда сохраняет кластерный порядок. Таким образом, если вы кластеризируете несколько подходящих моделей gmdistribution
, cluster
может присвоить различные кластерные метки для подобных компонентов.
cluster
| fitgmdist
| gmdistribution