Предскажите метки класса Используя 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 загружаться в функции при помощи saveLearnerForCoder.

saveLearnerForCoder(Mdl,'DiscrIris');

saveLearnerForCoder уплотняет 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 использование loadLearnerForCoder.

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

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 = loadLearnerForCoder('DiscrIris');
labelTemp = predict(mdl,X);
label = IrisSpecies(labelTemp);
end

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

sfName = 'sf_countflowers';
open_system(sfName);

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

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

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

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

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

fisheririsInput.time = (0:74)';
fisheririsInput.signals.dimensions = 4;
fisheririsInput.signals.values = X;

Можно поменять имя от fisheririsInput, и затем задайте новое имя в модели. Однако 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). Для получения дополнительной информации смотрите, Генерируют код С для Модели (Simulink Coder).

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

| | | (Simulink)

Похожие темы