Предскажите метки класса Используя Stateflow

Этот пример показывает, как использовать график Stateflow® для прогноза метки. Пример обучает модель дискриминантного анализа ирисовому набору данных Фишера при помощи fitcdiscr и задает функцию для генерации кода, которая загружает обученную модель и предсказывает метки для новых данных. Диаграмма Stateflow в этом примере принимает данные о потоковой передаче и предсказывает метки с помощью функции, которую вы задаете.

Ирисовый набор данных Фишера, который включен в Statistics and Machine Learning Toolbox™, содержит разновидности (species) и измерения (meas) на длине чашелистика, ширине чашелистика, лепестковой длине и лепестковой ширине для 150 ирисовых экземпляров. Набор данных содержит 50 экземпляров от каждой из трех разновидностей: setosa, versicolor, и virginica.

Загрузите ирисовый набор данных Фишера.

load fisheriris

Преобразуйте species в индексный вектор, где 1, 2, и 3 соответствуют setosa, versicolor, и virginica, соответственно.

species = grp2idx(species);

Разделите данные в набор обучающих данных и набор тестов.

rng('default') % For reproducibility
idx1 = randperm(150,75)';
idx2 = setdiff((1:150)',idx1);
X = meas(idx1,:);
Y = species(idx1,:);
trainX = meas(idx2,:);
trainY = species(idx2,:);

Используйте trainX и trainY, чтобы обучить модель и использовать X и Y, чтобы протестировать обученную модель.

Обучите квадратичную модель дискриминантного анализа.

Mdl = fitcdiscr(trainX,trainY,'DiscrimType','quadratic');

Mdl является моделью ClassificationDiscriminant. В командной строке можно использовать Mdl, чтобы сделать прогнозы для новых наблюдений. Однако вы не можете использовать Mdl в качестве входного параметра в функции для генерации кода. Подготовьте Mdl, чтобы загрузиться в функции при помощи saveCompactModel.

saveCompactModel(Mdl,'DiscrIris');

saveCompactModel уплотняет Mdl и сохраняет его в MAT-файле DiscrIris.mat.

Чтобы отобразить предсказанные разновидности в поле отображения модели Stateflow®, задайте класс перечисления при помощи блока classdef в файле MATLAB IrisSpecies.m.

classdef IrisSpecies < Simulink.IntEnumType
  enumeration
    Setosa(1)
    Versicolor(2)
    Virginica(3)
  end
end

Для получения дополнительной информации о перечислимых данных, смотрите, Задают Перечислимые Типы данных (Stateflow).

Задайте функцию с именем mypredict.m, который предсказывает ирисовые разновидности от новых данных об измерении при помощи обученной модели. Функция должна:

  • Включайте директиву генерации кода %#codegen где-нибудь в функции.

  • Примите ирисовые данные об измерении. Данные должны быть сопоставимы с X за исключением количества строк.

  • Загрузите DiscrIris.mat с помощью loadCompactModel.

  • Возвратите предсказанные ирисовые разновидности.

function label  = mypredict(X) %#codegen
%MYPREDICT Predict species of iris flowers using discriminant model
%   mypredict predicts species of iris flowers using the compact
%   discriminant model in the file DiscrIris.mat. Rows of X correspond to
%   observations and columns correspond to predictor variables. label is
%   the predicted species.
mdl = loadCompactModel('DiscrIris');
labelTemp = predict(mdl,X);
label = IrisSpecies(labelTemp);
end

Откройте модель sf_countflowers.slx Simulink®.

sfName = 'sf_countflowers';
open_system(sfName);

Фигуры отображают модель Simulink® и блок-схему, содержавшуюся в графике Stateflow®. Когда входной узел обнаруживает данные об измерении, он направляет данные в график. График затем предсказывает разновидность ирисового цветка и считает количество цветов для каждой разновидности. График возвращает предсказанные разновидности в рабочую область и отображает разновидности в модели по одному. Блок памяти хранилища данных NumFlowers хранит количество цветов для каждой разновидности.

График ожидает получать входные данные как массив структур под названием fisheririsInput, содержащий эти поля:

  • время- Моменты времени, в которых наблюдения вводят модель. В примере длительность включает целые числа от 0 до 74. Ориентация time должна соответствовать наблюдениям в данных о предикторе. Так, для этого примера time должен быть вектор-столбцом.

  • signals - Массив структур 1 на 1, описывающий входные данные и содержащий поля values и dimensions. Поле values является матрицей данных о предикторе. Поле dimensions является количеством переменных прогноза.

Создайте соответствующий массив структур для ирисовых цветочных измерений.

fisheririsInput.time = [0:74]';
fisheririsInput.signals.dimensions = 4;
fisheririsInput.signals.values = X;

Можно поменять имя от fisheririsInput, и затем задать новое имя в модели. However, Stateflow® ожидает, что массив структур будет содержать описанные имена полей. Для получения дополнительной информации смотрите Структуры данных Загрузки к Входным параметрам Корневого Уровня (Simulink).

Моделируйте модель.

sim(sfName)

Данные показывают модель после того, как она обработает все наблюдения в fisheririsInput по одному. Предсказанная разновидность X(75,:) является virginica. Количество setosa, versicolor, и virginica в X равняются 22, 22, и 31, соответственно.

Переменная logsout появляется в рабочей области. logsout является объектом SimulinkData.Dataset, содержащим предсказанные разновидности. Извлеките предсказанные данные о разновидностях из журнала симуляции.

labelSF = logsout.getElement(1).Values.Data;

Предскажите разновидности в командной строке с помощью predict.

labelCMD = predict(Mdl,X);

Сравните предсказанные разновидности, возвращенные sf_countflowers в возвращенных путем вызова predict в командной строке.

isequal(labelCMD,labelSF)
ans =

  logical

   1

isequal возвращает логическую единицу (true), если все входные параметры равны. Это сравнение подтверждает, что sf_countflowers возвращает ожидаемые результаты.

Если у вас также есть лицензия Simulink® Coder™, то можно сгенерировать код С от sf_countflowers.slx в Simulink® или из командной строки с помощью rtwbuild. Для получения дополнительной информации смотрите, Генерируют код С для Модели (Simulink Coder).

Смотрите также

| | |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте