exponenta event banner

Создание и визуализация классификатора дискриминантного анализа

В этом примере показано, как выполнить линейную и квадратичную классификацию данных радужки Фишера.

Загрузите образцы данных.

load fisheriris

Вектор столбца, species , состоит из цветков радужки трёх различных видов, сетозы, версиколора, виргиники. Двойная матрица meas состоит из четырёх видов измерений на цветках, длины и ширины чашелистиков и лепестков в сантиметрах соответственно.

Использовать длину лепестка (третий столбец в meas) и ширина лепестка (четвертый столбец в meas) измерения. Сохраните их как переменные PL и PW соответственно.

PL = meas(:,3);
PW = meas(:,4);

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

h1 = gscatter(PL,PW,species,'krb','ov^',[],'off');
h1(1).LineWidth = 2;
h1(2).LineWidth = 2;
h1(3).LineWidth = 2;
legend('Setosa','Versicolor','Virginica','Location','best')
hold on

Figure contains an axes. The axes contains 3 objects of type line. These objects represent Setosa, Versicolor, Virginica.

Создайте линейный классификатор.

X = [PL,PW];
MdlLinear = fitcdiscr(X,species);

Извлеките коэффициенты для линейной границы между вторым и третьим классами.

MdlLinear.ClassNames([2 3])
ans = 2x1 cell
    {'versicolor'}
    {'virginica' }

K = MdlLinear.Coeffs(2,3).Const;  
L = MdlLinear.Coeffs(2,3).Linear;

Постройте график кривой, разделяющей второй и третий классы

K + [x1x2] L = 0.

f = @(x1,x2) K + L(1)*x1 + L(2)*x2;
h2 = fimplicit(f,[.9 7.1 0 2.5]);
h2.Color = 'r';
h2.LineWidth = 2;
h2.DisplayName = 'Boundary between Versicolor & Virginica';

Figure contains an axes. The axes contains 4 objects of type line, implicitfunctionline. These objects represent Setosa, Versicolor, Virginica, Boundary between Versicolor & Virginica.

Извлеките коэффициенты для линейной границы между первым и вторым классами.

MdlLinear.ClassNames([1 2])
ans = 2x1 cell
    {'setosa'    }
    {'versicolor'}

K = MdlLinear.Coeffs(1,2).Const;
L = MdlLinear.Coeffs(1,2).Linear;

Постройте график кривой, разделяющей первый и второй классы.

f = @(x1,x2) K + L(1)*x1 + L(2)*x2;
h3 = fimplicit(f,[.9 7.1 0 2.5]);
h3.Color = 'k';
h3.LineWidth = 2;
h3.DisplayName = 'Boundary between Versicolor & Setosa';
axis([.9 7.1 0 2.5])
xlabel('Petal Length')
ylabel('Petal Width')
title('{\bf Linear Classification with Fisher Training Data}')

Figure contains an axes. The axes with title {\bf Linear Classification with Fisher Training Data} contains 5 objects of type line, implicitfunctionline. These objects represent Setosa, Versicolor, Virginica, Boundary between Versicolor & Virginica, Boundary between Versicolor & Setosa.

Создайте квадратичный классификатор дискриминантов.

MdlQuadratic = fitcdiscr(X,species,'DiscrimType','quadratic');

Удаление линейных границ из графика.

delete(h2);
delete(h3);

Figure contains an axes. The axes with title {\bf Linear Classification with Fisher Training Data} contains 3 objects of type line. These objects represent Setosa, Versicolor, Virginica.

Извлеките коэффициенты для квадратичной границы между вторым и третьим классами.

MdlQuadratic.ClassNames([2 3])
ans = 2x1 cell
    {'versicolor'}
    {'virginica' }

K = MdlQuadratic.Coeffs(2,3).Const;
L = MdlQuadratic.Coeffs(2,3).Linear; 
Q = MdlQuadratic.Coeffs(2,3).Quadratic;

Постройте график кривой, разделяющей второй и третий классы

K + [x1x2] L + [x1x2] Q [x1x2] = 0.

f = @(x1,x2) K + L(1)*x1 + L(2)*x2 + Q(1,1)*x1.^2 + ...
    (Q(1,2)+Q(2,1))*x1.*x2 + Q(2,2)*x2.^2;
h2 = fimplicit(f,[.9 7.1 0 2.5]);
h2.Color = 'r';
h2.LineWidth = 2;
h2.DisplayName = 'Boundary between Versicolor & Virginica';

Figure contains an axes. The axes with title {\bf Linear Classification with Fisher Training Data} contains 4 objects of type line, implicitfunctionline. These objects represent Setosa, Versicolor, Virginica, Boundary between Versicolor & Virginica.

Извлеките коэффициенты для квадратичной границы между первым и вторым классами.

MdlQuadratic.ClassNames([1 2])
ans = 2x1 cell
    {'setosa'    }
    {'versicolor'}

K = MdlQuadratic.Coeffs(1,2).Const;
L = MdlQuadratic.Coeffs(1,2).Linear; 
Q = MdlQuadratic.Coeffs(1,2).Quadratic;

Постройте график кривой, разделяющей первый и второй классы.

f = @(x1,x2) K + L(1)*x1 + L(2)*x2 + Q(1,1)*x1.^2 + ...
    (Q(1,2)+Q(2,1))*x1.*x2 + Q(2,2)*x2.^2;
h3 = fimplicit(f,[.9 7.1 0 1.02]); % Plot the relevant portion of the curve.
h3.Color = 'k';
h3.LineWidth = 2;
h3.DisplayName = 'Boundary between Versicolor & Setosa';
axis([.9 7.1 0 2.5])
xlabel('Petal Length')
ylabel('Petal Width')
title('{\bf Quadratic Classification with Fisher Training Data}')
hold off

Figure contains an axes. The axes with title {\bf Quadratic Classification with Fisher Training Data} contains 5 objects of type line, implicitfunctionline. These objects represent Setosa, Versicolor, Virginica, Boundary between Versicolor & Virginica, Boundary between Versicolor & Setosa.

См. также

Функции

Объекты

Связанные темы