В этом примере показано, как использовать диаграмму 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).
loadLearnerForCoder | predict | saveLearnerForCoder | slbuild (Симулинк)