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