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