Предсказание меток классов с помощью Stateflow

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

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

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

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

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

sfName = 'sf_countflowers';
open_system(sfName);

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

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

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

  • signals - массив структур 1 на 1, описывающий входные данные и содержащий поля values и dimensions. The values поле является матрицей данных предиктора. The 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 возвращает логический 1 (true), если все входы равны. Это сравнение подтверждает, что sf_countflowers возвращает ожидаемые результаты.

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

См. также

| | | (Simulink)

Похожие темы