fitgmdist

Подбор Смешанной гауссовской модели к данным

Описание

пример

GMModel = fitgmdist(X,k) возвращает Гауссову модель распределения смеси (GMModel) с k компоненты, установленные на данных (X).

пример

GMModel = fitgmdist(X,k,Name,Value) возвращает Гауссову модель распределения смеси с дополнительными опциями, заданными одним или несколькими Name,Value аргументы в виде пар.

Для примера можно задать значение регуляризации или тип ковариации.

Примеры

свернуть все

Сгенерируйте данные из смеси двух двухмерных Гауссовых распределений.

mu1 = [1 2];
Sigma1 = [2 0; 0 0.5];
mu2 = [-3 -5];
Sigma2 = [1 0;0 1];
rng(1); % For reproducibility
X = [mvnrnd(mu1,Sigma1,1000); mvnrnd(mu2,Sigma2,1000)];

Подбор смешанной гауссовской модели. Укажите, что существует два компонента.

GMModel = fitgmdist(X,2);

Постройте график данных по установленным контурам смешанной гауссовской модели.

figure
y = [zeros(1000,1);ones(1000,1)];
h = gscatter(X(:,1),X(:,2),y);
hold on
gmPDF = @(x,y) arrayfun(@(x0,y0) pdf(GMModel,[x0 y0]),x,y);
g = gca;
fcontour(gmPDF,[g.XLim g.YLim])
title('{\bf Scatter Plot and Fitted Gaussian Mixture Contours}')
legend(h,'Model 0','Model1')
hold off

Figure contains an axes. The axes with title {\bf Scatter Plot and Fitted Gaussian Mixture Contours} contains 3 objects of type line, functioncontour. These objects represent Model 0, Model1.

Сгенерируйте данные из смеси двух двухмерных Гауссовых распределений. Создайте третий предиктор, который является суммой первого и второго предикторов.

mu1 = [1 2];
Sigma1 = [1 0; 0 1];
mu2 = [3 4];
Sigma2 = [0.5 0; 0 0.5];
rng(3); % For reproducibility
X1 = [mvnrnd(mu1,Sigma1,100);mvnrnd(mu2,Sigma2,100)];
X = [X1,X1(:,1)+X1(:,2)];

Столбцы X являются линейно зависимыми. Это может вызвать плохо обусловленные ковариационные оценки.

Подбор Смешанной гауссовской модели к данным. Можно использовать try / catch операторы, которые помогают управлять сообщениями об ошибке.

rng(1); % Reset seed for common start values
try
    GMModel = fitgmdist(X,2)
catch exception
    disp('There was an error fitting the Gaussian mixture model')
    error = exception.message
end
There was an error fitting the Gaussian mixture model
error = 
'Ill-conditioned covariance created at iteration 3.'

Ковариационные оценки являются плохо обусловленными. Следовательно, оптимизация останавливается, и появляется ошибка.

Снова подгоняйте Смешанную гауссовскую модель, но используйте регуляризацию.

rng(3); % Reset seed for common start values
GMModel = fitgmdist(X,2,'RegularizationValue',0.1)
GMModel = 

Gaussian mixture distribution with 2 components in 3 dimensions
Component 1:
Mixing proportion: 0.536725
Mean:    2.8831    3.9506    6.8338

Component 2:
Mixing proportion: 0.463275
Mean:    0.8813    1.9758    2.8571

В этом случае алгоритм сходится к решению из-за регуляризации.

Смешанные гауссовские модели перед подгонкой к данным необходимо задать несколько компонентов. Для многих приложений может оказаться трудным узнать соответствующее количество компонентов. В этом примере показано, как исследовать данные и попытаться получить начальное предположение о количестве компонентов, используя анализ основных компонентов.

Загрузите набор данных радужки Фишера.

load fisheriris
classes = unique(species)
classes = 3x1 cell
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

Набор данных содержит три класса видов радужки. Анализ выполняется так, как будто это неизвестно.

Используйте анализ основного компонента, чтобы уменьшить размерность данных до двух измерений для визуализации.

[~,score] = pca(meas,'NumComponents',2);

Подгонка трёх смешанных гауссовских моделей к данным путем определения 1, 2 и 3 компонентов. Увеличьте количество итераций оптимизации до 1000. Используйте запись через точку для хранения окончательных оценок параметров. По умолчанию программное обеспечение соответствует полным и различным ковариациям для каждого компонента.

GMModels = cell(3,1); % Preallocation
options = statset('MaxIter',1000);
rng(1); % For reproducibility

for j = 1:3
    GMModels{j} = fitgmdist(score,j,'Options',options);
    fprintf('\n GM Mean for %i Component(s)\n',j)
    Mu = GMModels{j}.mu
end
 GM Mean for 1 Component(s)
Mu = 1×2
10-14 ×

    0.1044   -0.0429

 GM Mean for 2 Component(s)
Mu = 2×2

    1.3212   -0.0954
   -2.6424    0.1909

 GM Mean for 3 Component(s)
Mu = 3×2

    0.4856   -0.1287
    1.4484   -0.0904
   -2.6424    0.1909

GMModels - массив ячеек, содержащий три, установленные gmdistribution модели. Средства в трёх моделях компонента различны, что позволяет предположить, что модель различает три вида радужки.

Постройте графики счетов по подобранным контурам смешанной гауссовской модели. Поскольку набор данных включает метки, используйте gscatter чтобы различить истинное количество компонентов.

figure
for j = 1:3
    subplot(2,2,j)
    h1 = gscatter(score(:,1),score(:,2),species);
    h = gca;
    hold on
    gmPDF = @(x,y) arrayfun(@(x0,y0) pdf(GMModels{j},[x0 y0]),x,y);
    fcontour(gmPDF,[h.XLim h.YLim],'MeshDensity',100)
    title(sprintf('GM Model - %i Component(s)',j));
    xlabel('1st principal component');
    ylabel('2nd principal component');
    if(j ~= 3)
        legend off;
    end
    hold off
end
g = legend(h1);
g.Position = [0.7 0.25 0.1 0.1];

Figure contains 3 axes. Axes 1 with title GM Model - 1 Component(s) contains 4 objects of type line, functioncontour. These objects represent setosa, versicolor, virginica. Axes 2 with title GM Model - 2 Component(s) contains 4 objects of type line, functioncontour. These objects represent setosa, versicolor, virginica. Axes 3 with title GM Model - 3 Component(s) contains 4 objects of type line, functioncontour. These objects represent setosa, versicolor, virginica.

Трехкомпонентная смешанная гауссовская модель в сочетании с РСА выглядит так, как будто она различает три вида радужной оболочки глаза.

Существуют другие опции, которые можно использовать, чтобы помочь выбрать соответствующее количество компонентов для смешанной гауссовской модели. Для примера,

  • Сравните несколько моделей с различным количеством компонентов, используя информационные критерии, например, AIC или BIC.

  • Оцените количество кластеров, использующих evalclusters, который поддерживает, критерий Калински-Харабаша и статистику разрывов или другие критерии.

Смешанные гауссовские модели перед подгонкой к данным необходимо задать несколько компонентов. Для многих приложений может оказаться трудным узнать соответствующее количество компонентов. Этот пример использует статистику АПК-подгонки, чтобы помочь вам выбрать наиболее подходящую Смешанную гауссовскую модель для меняющегося количества компонентов.

Сгенерируйте данные из смеси двух двухмерных Гауссовых распределений.

mu1 = [1 1];
Sigma1 = [0.5 0; 0 0.5];
mu2 = [2 4];
Sigma2 = [0.2 0; 0 0.2];
rng(1);
X = [mvnrnd(mu1,Sigma1,1000);mvnrnd(mu2,Sigma2,1000)];

plot(X(:,1),X(:,2),'ko')
title('Scatter Plot')
xlim([min(X(:)) max(X(:))]) % Make axes have the same scale
ylim([min(X(:)) max(X(:))])

Figure contains an axes. The axes with title Scatter Plot contains an object of type line.

Предположим, что вы не знаете базовых значений параметров, графики поля точек предлагают:

  • Существует два компонента.

  • Отклонения между кластерами различаются.

  • Отклонение внутри кластеров одинаковая.

  • В кластерах нет ковариации.

Подбор двухкомпонентной Смешанной гауссовской модели. Основываясь на проверке графика поля точек, задайте, что ковариационные матрицы являются диагональными. Печать окончательной статистики итерации и логарифмической правдоподобности в Командное окно путем передачи statset структура как значение Options аргумент пары "имя-значение".

options = statset('Display','final');
GMModel = fitgmdist(X,2,'CovarianceType','diagonal','Options',options);
11 iterations, log-likelihood = -4787.38

GMModel является установленным gmdistribution модель.

Исследуйте AIC по различному количеству компонентов.

AIC = zeros(1,4);
GMModels = cell(1,4);
options = statset('MaxIter',500);
for k = 1:4
    GMModels{k} = fitgmdist(X,k,'Options',options,'CovarianceType','diagonal');
    AIC(k)= GMModels{k}.AIC;
end

[minAIC,numComponents] = min(AIC);
numComponents
numComponents = 2
BestModel = GMModels{numComponents}
BestModel = 

Gaussian mixture distribution with 2 components in 2 dimensions
Component 1:
Mixing proportion: 0.501719
Mean:    1.9824    4.0013

Component 2:
Mixing proportion: 0.498281
Mean:    0.9880    1.0511

Наименьший AIC происходит, когда программное обеспечение подходит для двухкомпонентных Смешанных гауссовских моделей.

Смешанные гауссовские модели оценки параметров могут варьироваться при различных начальных значениях. В этом примере показов, как управлять начальными значениями, когда вы подгоняете Смешанные гауссовские модели используя fitgmdist.

Загрузите набор данных радужки Фишера. Используйте длины и ширины лепестков в качестве предикторов.

load fisheriris
X = meas(:,3:4);

Подбор Смешанной гауссовской модели к данным с помощью начальных значений по умолчанию. Существует три вида радужки, поэтому задайте k = 3 компонента.

rng(10); % For reproducibility
GMModel1 = fitgmdist(X,3);

По умолчанию программное обеспечение:

  1. Реализует k-средних значений + + Алгоритм для Инициализации, чтобы выбрать k = 3 начальных центров кластера.

  2. Устанавливает начальные ковариационные матрицы как диагональные, где элемент (j, j) - отклонение X(:,j).

  3. Обрабатывает начальные пропорции смешивания как равномерные.

Подгонка Смешанной гауссовской модели путем соединения каждого наблюдения с его меткой.

y = ones(size(X,1),1);
y(strcmp(species,'setosa')) = 2;
y(strcmp(species,'virginica')) = 3;

GMModel2 = fitgmdist(X,3,'Start',y);

Подгонка смешанной гауссовской модели путем явного определения начальных средств, ковариационных матриц и пропорций смешения.

Mu = [1 1; 2 2; 3 3];
Sigma(:,:,1) = [1 1; 1 2];
Sigma(:,:,2) = 2*[1 1; 1 2];
Sigma(:,:,3) = 3*[1 1; 1 2];
PComponents = [1/2,1/4,1/4];
S = struct('mu',Mu,'Sigma',Sigma,'ComponentProportion',PComponents);

GMModel3 = fitgmdist(X,3,'Start',S);

Использование gscatter чтобы построить диаграмму рассеяния, которая различает виды радужки. Для каждой модели постройте график подобранных контуров смешанной гауссовской модели.

figure
subplot(2,2,1)
h = gscatter(X(:,1),X(:,2),species,[],'o',4);
haxis = gca;
xlim = haxis.XLim;
ylim = haxis.YLim;
d = (max([xlim ylim])-min([xlim ylim]))/1000;
[X1Grid,X2Grid] = meshgrid(xlim(1):d:xlim(2),ylim(1):d:ylim(2));
hold on
contour(X1Grid,X2Grid,reshape(pdf(GMModel1,[X1Grid(:) X2Grid(:)]),...
    size(X1Grid,1),size(X1Grid,2)),20)
uistack(h,'top')
title('{\bf Random Initial Values}');
xlabel('Sepal length');
ylabel('Sepal width');
legend off;
hold off
subplot(2,2,2)
h = gscatter(X(:,1),X(:,2),species,[],'o',4);
hold on
contour(X1Grid,X2Grid,reshape(pdf(GMModel2,[X1Grid(:) X2Grid(:)]),...
    size(X1Grid,1),size(X1Grid,2)),20)
uistack(h,'top')
title('{\bf Initial Values from Labels}');
xlabel('Sepal length');
ylabel('Sepal width');
legend off
hold off
subplot(2,2,3)
h = gscatter(X(:,1),X(:,2),species,[],'o',4);
hold on
contour(X1Grid,X2Grid,reshape(pdf(GMModel3,[X1Grid(:) X2Grid(:)]),...
    size(X1Grid,1),size(X1Grid,2)),20)
uistack(h,'top')
title('{\bf Initial Values from the Structure}');
xlabel('Sepal length');
ylabel('Sepal width');
legend('Location',[0.7,0.25,0.1,0.1]);
hold off

Figure contains 3 axes. Axes 1 with title {\bf Random Initial Values} contains 4 objects of type contour, line. These objects represent virginica, versicolor, setosa. Axes 2 with title {\bf Initial Values from Labels} contains 4 objects of type contour, line. These objects represent virginica, versicolor, setosa. Axes 3 with title {\bf Initial Values from the Structure} contains 4 objects of type contour, line. These objects represent virginica, versicolor, setosa.

По контурам GMModel2 по-видимому, предполагает небольшую тримодальность, в то время как другие предполагают бимодальные распределения.

Отобразите предполагаемые средства компонента.

table(GMModel1.mu,GMModel2.mu,GMModel3.mu,'VariableNames',...
    {'Model1','Model2','Model3'})
ans=3×3 table
         Model1               Model2              Model3     
    _________________    ________________    ________________

    5.2115     2.0119    4.2857    1.3339    1.4604    0.2429
     1.461    0.24423     1.462     0.246    4.7509    1.4629
    4.6829     1.4429    5.5507    2.0316    5.0158    1.8592

GMModel2 кажется, различают виды радужки лучшими.

Входные параметры

свернуть все

Данные, к которым подгоняется смешанная гауссовская модель, задаются в виде числовой матрицы.

Строки X соответствуют наблюдениям, и столбцы X соответствуют переменным. Количество наблюдений должно быть больше каждого из следующих: количества переменных и количества компонентов.

NaNs указывает отсутствующие значения. Программа удаляет строки X содержит, по меньшей мере, один NaN перед подбором кривой, которая уменьшает эффективный размер выборки.

Типы данных: single | double

Количество компонентов, используемых при подборе Смешанной гауссовской модели, заданное как положительное целое число. Для примера, если вы задаете k = 3, затем программное обеспечение подходит для смешанной гауссовской модели с тремя различными средствами, ковариационными матрицами и пропорциями компонентов к данным (X).

Типы данных: single | double

Аргументы в виде пар имя-значение

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Пример: 'RegularizationValue',0.1,'CovarianceType','diagonal' задает значение параметров регуляризации 0,1 и для соответствия диагональным ковариационным матрицам.

Тип ковариационной матрицы для соответствия данным, заданный как разделенная разделенными запятой парами, состоящая из 'CovarianceType' и любой из них 'diagonal' или 'full'.

Если вы задаете 'diagonal', затем программное обеспечение подходит к диагональным ковариационным матрицам. В этом случае программное обеспечение оценивает k*d ковариационные параметры, где d количество столбцов в X (т.е. d = size(X,2)).

В противном случае программное обеспечение подходит к полным ковариационным матрицам. В этом случае программное обеспечение оценивает k*d*(d+1)/2 ковариационные параметры.

Пример: 'CovarianceType','diagonal'

Итерационные опции оптимизации алгоритма EM, заданные как разделенная разделенными запятой парами, состоящая из 'Options' и statset структура опций.

Эта таблица описывает доступные аргументы пары "имя-значение".

ИмяЗначение
'Display'

'final': Отобразите окончательный выход.

'iter': Отобразите итерационный выход в Командное окно для некоторых функций; в противном случае отобразится окончательный выход.

'off': Не отображать информацию об оптимизации.

'MaxIter'Положительное целое число, указывающее на максимальное количество разрешенных итераций. Значение по умолчанию является 100
'TolFun'Положительная скалярная величина, указывающий на допуск окончания для значения функции логарифмической правдоподобности. Значение по умолчанию является 1e-6.

Пример: 'Options',statset('Display','final','MaxIter',1500,'TolFun',1e-5)

Допуск для апостериорных вероятностей, заданный как разделенная разделенными запятой парами, состоящая из ProbabilityTolerance и неотрицательное скалярное значение в области значений [0,1e-6].

В каждой итерации, после оценки апостериорных вероятностей, fitgmdist устанавливает любую апостериорную вероятность, которая не больше значения допуска, равной нулю. Использование ненулевого допуска может ускориться fitgmdist.

Пример: 'ProbabilityTolerance',0.0000025

Типы данных: single | double

Значение параметров регуляризации, заданное как разделенная разделенными запятой парами, состоящая из 'RegularizationValue' и неотрицательный скаляр.

Задайте RegularizationValue к небольшой положительной скалярной величине, чтобы убедиться, что предполагаемые ковариационные матрицы положительно определены.

Пример: 'RegularizationValue',0.01

Типы данных: single | double

Количество раз, чтобы повторить алгоритм EM с использованием нового набора начальных значений, заданных как разделенная разделенными запятой парами, состоящая из 'Replicates' и положительное целое число.

Если Replicates больше 1, затем:

  • Область аргумента пары "имя-значение" Start должен быть plus (по умолчанию) или randSample.

  • GMModel - подгонка с наибольшей логарифмической правдоподобностью.

Пример: 'Replicates',10

Типы данных: single | double

Флаг, указывающий, являются ли все ковариационные матрицы идентичными (то есть подходят для объединенной оценки), заданный как разделенная разделенными запятой парами, состоящая из 'SharedCovariance' и любое логическое значение false или true.

Если SharedCovariance является true, затем все k ковариационные матрицы равны, и количество ковариационных параметров масштабируется в множителе k.

Метод установки начального значения, заданный как разделенная разделенными запятой парами, состоящая из 'Start' и 'randSample', 'plus', вектор из целых чисел или массив структур.

Значение Start определяет начальные значения, требуемые стандартной программой оптимизации для каждого параметра Гауссова компонента - среднего, ковариационного и смешивающей пропорции. В этой таблице представлены доступные опции.

ЗначениеОписание
'randSample'Программа выбирает k наблюдения от X случайным образом в качестве начального средства компонента. Пропорции смешивания являются равномерными. Начальные ковариационные матрицы для всех компонентов диагональны, где элемент j на диагонали расположено отклонение X(:,j).
'plus'Программа выбирает k наблюдения от X использование k алгоритма -means + +. Начальные пропорции смешивания являются равномерными. Начальные ковариационные матрицы для всех компонентов диагональны, где элемент j на диагонали расположено отклонение X(:,j).
Вектор целых чисел Вектор длины n (количество наблюдений), содержащий начальное предположение индекса компонента для каждой точки. То есть каждый элемент является целым числом от 1 до k, что соответствует компоненту. Программа собирает все наблюдения, соответствующие одному и тому же компоненту, вычисляет средние значения, ковариации и пропорции смешения для каждого и устанавливает начальные значения для этой статистики.
Массив структур

Предположим, что есть d переменные (т.е. d = size(X,2)). Массив структур, например S, должно иметь три поля:

  • S.mu: A k-by- d матрица, задающая начальное среднее значение каждого компонента

  • S.Sigma: Числовой массив, задающий ковариационную матрицу каждого компонента. Sigma является одним из следующих:

    • A d-by- d-by- k массив. Sigma(:,:,j) - начальная ковариационная матрица компонента j.

    • A 1-by- d-by- k массив. diag(Sigma(:,:,j)) - начальная ковариационная матрица компонента j.

    • A d-by- d матрица. Sigma является начальной ковариационной матрицей для всех компонентов.

    • A 1-by- d вектор. diag(Sigma) является начальной ковариационной матрицей для всех компонентов.

  • S.ComponentProportion: A 1-by- k вектор скаляров, задающий начальные пропорции смешения каждого компонента. Значение по умолчанию является равномерным.

Пример: 'Start',ones(n,1)

Типы данных: single | double | char | string | struct

Выходные аргументы

свернуть все

Подобранная Смешанная гауссовская модель, возвращенная как gmdistribution модель.

Свойства доступа к GMModel использование записи через точку. Для примера отобразите AIC путем ввода GMModel.AIC.

Совет

fitgmdist может:

  • Сходитесь к решению, где один или несколько компонентов имеют плохо обусловленную или сингулярную ковариационную матрицу.

    Следующие проблемы могут привести к плохо обусловленной ковариационной матрице:

    • Количество размерностей ваших данных относительно велико, и наблюдений недостаточно.

    • Некоторые предикторы (переменные) ваших данных сильно коррелируют.

    • Некоторые или все функции являются дискретными.

    • Вы пытались подогнать данные к слишком большому количеству компонентов.

    В целом можно избежать получения плохо обусловленных ковариационных матриц с помощью одной из следующих мер предосторожности:

    • Предварительно обработайте данные, чтобы удалить коррелированные функции.

    • Задайте 'SharedCovariance' на true использовать равную ковариационную матрицу для каждого компонента.

    • Задайте 'CovarianceType' на 'diagonal'.

    • Использование 'RegularizationValue' добавить очень маленькое положительное число к диагонали каждой ковариационной матрицы.

    • Попробуйте другой набор начальных значений.

  • Пройти промежуточную стадию, где один или несколько компонентов имеют плохо обусловленную ковариационную матрицу. Попробуйте другой набор начальных значений, чтобы избежать этой проблемы, не изменяя свои данные или модель.

Алгоритмы

свернуть все

Оптимизация вероятностей смешанной гауссовской модели

Программа оптимизирует вероятность Смешанной гауссовской модели с помощью итерационного алгоритма Ожидание-Максимизация (EM).

fitgmdist подходит для GMM к данным с помощью итерационного алгоритма Expectation-Maximization (EM). Используя начальные значения для средств компонента, ковариационных матриц и пропорций смешения, алгоритм EM продолжает использовать эти шаги.

  1. Для каждого наблюдения алгоритм вычисляет апостериорные вероятности членства компонента. Можно представить результат как n матрицу k, где элемент (i, j) содержит апостериорную вероятность того, что i наблюдений из j компонента. Это - E -степ алгоритма EM.

  2. Используя апостериорные вероятности принадлежности к компоненту в качестве весов, алгоритм оценивает среднее значение компонента, ковариационные матрицы и смешивание пропорций путем применения максимальной вероятности. Это - M -степ алгоритма EM.

Алгоритм повторяет эти шаги до сходимости. Поверхность вероятности сложна, и алгоритм может сходиться к локальному оптимуму. Кроме того, полученный локальный оптимум может зависеть от начальных условий. fitgmdist имеет несколько опции выбора начальных условий, включая случайные назначения компонентов для наблюдений и алгоритм k -means + + .

k -меанс + + алгоритм инициализации

Алгоритм k -means + + использует эвристический метод для поиска семян центроидов для кластеризации k -means .fitgmdist может применить тот же принцип для инициализации алгоритма EM с помощью алгоритма k-means + +, чтобы выбрать начальные значения параметров для подобранной смешанной гауссовской модели.

Алгоритм k -means + + принимает, что количество кластеров k, и выбирает начальные значения параметров следующим образом.

  1. Выберите смесь компонентов, чтобы быть равномерной вероятностью pi=1k, где i = 1,..., k.

  2. Выберите ковариационные матрицы, чтобы быть диагональными и идентичными, где σi=diag(a1,a2,,ak) и aj=var(Xj).

  3. Выберите первый начальный центр компонента, μ 1 равномерно из всех точек данных в X.

  4. Чтобы выбрать центр j:

    1. Вычислите расстояния Махаланобиса от каждого наблюдения до каждого центроида и присвойте каждое наблюдение своему ближайшему центроиду.

    2. Для m = 1,..., n и p = 1,..., j - 1, выберите j центроида случайным образом из X с вероятностью

      d2(xm,μp)h;xhΜpd2(xh,μp)

      где d(xm,μp) является расстоянием между m наблюдений и μp, и Mp является набором всех наблюдений, ближайших к центроиду μp и xm принадлежит Mp.

      То есть выберите каждый последующий центр с вероятностью, пропорциональной расстоянию от себя до ближайшего центра, который вы уже выбрали.

  5. Повторите шаг 4, пока не будут выбраны k центроиды.

Ссылки

[1] McLachlan, G. и D. Peel. Модели конечной смеси. Hoboken, NJ: John Wiley & Sons, Inc., 2000.

Введенный в R2014a