В этом примере показано, как решить, что лучшая смешанная гауссовская модель (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 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
может присвоить различные кластерные метки для подобных компонентов.
fitgmdist
| gmdistribution
| cluster