exponenta event banner

Прогнозирование меток классов с использованием потока состояний

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

Набор данных радужки Фишера, который включен в Toolbox™ статистики и машинного обучения, содержит виды (species) и измерения (meas) на чашелистике длиной, чашелистиком шириной, лепестком длиной и лепестком шириной для 150 экземпляров радужки. Набор данных содержит по 50 экземпляров от каждого из трёх видов: сетоза, версиколор и 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

Дополнительные сведения о перечисляемых данных см. в разделе Определение перечисляемых типов данных (поток состояний).

Определение функции с именем 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. values поле является матрицей данных предиктора. dimensions поле - количество переменных предиктора.

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

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

Можно изменить имя с fisheririsInput, а затем укажите новое имя в модели. Однако Stateflow ожидает, что массив структуры будет содержать описанные имена полей. Дополнительные сведения см. в разделе Загрузка структур данных на входы корневого уровня (Simulink).

Моделирование модели.

sim(sfName)

На рисунке показана модель после обработки всех наблюдений в fisheririsInputпо одному. Прогнозируемый вид X(75,:) это virginica. Количество сетозы, версиколора и 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™ можно создать код C из sf_countflowers.slx в Simulink или из командной строки с помощью rtwbuild (Simulink Coder). Дополнительные сведения см. в разделе Создание кода C для модели (Simulink Coder).

См. также

| | | (Симулинк)

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