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