В этом примере показано, как добавить блок MATLAB ® Function к модели Simulink ® для предсказания метки. Блок MATLAB Function принимает потоковые данные и предсказывает оценку метки и классификации с помощью обученной модели классификации векторной машины поддержки (SVM). Для получения дополнительной информации об использовании блока MATLAB Function, смотрите Создать Пользовательскую Функциональность Используя Function Block (Simulink) MATLAB.
Этот пример использует ionosphere
набор данных, который содержит качества radar-return (Y
) и данные предиктора (X
). Радиолокационные возвраты имеют хорошее качество ('g'
) или плохого качества ('b'
).
Загрузите ionosphere
набор данных. Определите размер выборки.
load ionosphere
n = numel(Y)
n = 351
Блок MATLAB Function не может вернуть массивы ячеек. Преобразуйте переменную отклика в логический вектор, элементы которого 1
если радар возвращается хорошо, и 0
в противном случае.
Y = strcmp(Y,'g');
Предположим, что радарные возвраты обнаруживаются последовательно, и у вас есть первые 300 наблюдений, но вы еще не получили последние 51. Разделите данные на настоящие и будущие выборки.
prsntX = X(1:300,:); prsntY = Y(1:300); ftrX = X(301:end,:); ftrY = Y(301:end);
Обучите модель SVM, используя все, доступные в настоящее время данные. Задайте стандартизацию данных предиктора.
Mdl = fitcsvm(prsntX,prsntY,'Standardize',true);
Mdl
является ClassificationSVM
модель.
saveLearnerForCoder
В командной строке можно использовать Mdl
делать предсказания для новых наблюдений. Однако вы не можете использовать Mdl
как входной параметр в функции, предназначенной для генерации кода.
Подготовка Mdl
загружается внутри функции с помощью saveLearnerForCoder
.
saveLearnerForCoder(Mdl,'SVMIonosphere');
saveLearnerForCoder
уплотняет Mdl
, а затем сохраняет его в MAT-файле SVMIonosphere.mat
.
Задайте функцию MATLAB с именем svmIonospherePredict.m
что предсказывает, является ли радиолокационный возврат хорошим качеством. Функция должна:
Включите директиву генерации кода %#codegen
где-то в функции.
Примите данные предиктора возврата радара. Данные должны быть соизмеримы с X
за исключением количества строк.
Загрузка SVMIonosphere.mat
использование loadLearnerForCoder
.
Верните предсказанные метки и классификационные оценки для предсказания качества возврата радара как хорошего (то есть счет положительного класса).
function [label,score] = svmIonospherePredict(X) %#codegen %svmIonospherePredict Predict radar-return quality using SVM model % svmIonospherePredict predicts labels and estimates classification % scores of the radar returns in the numeric matrix of predictor data X % using the compact SVM model in the file SVMIonosphere.mat. Rows of X % correspond to observations and columns to predictor variables. label % is the predicted label and score is the confidence measure for % classifying the radar-return quality as good. % % Copyright 2016 The MathWorks Inc. Mdl = loadLearnerForCoder('SVMIonosphere'); [label,bothscores] = predict(Mdl,X); score = bothscores(:,2); end
Примечание.Если нажать кнопку, расположенную в правом верхнем разделе этой страницы и открыть этот пример в MATLAB, MATLAB открывает папку примера. Эта папка включает файл функции точки входа.
Создайте модель Simulink с блоком MATLAB Function, который отправляет в svmIonospherePredict.m
.
Этот пример предоставляет модель Simulink slexSVMIonospherePredictExample.slx
. Откройте модель Simulink.
SimMdlName = 'slexSVMIonospherePredictExample';
open_system(SimMdlName)
Рисунок отображает модель Simulink. Когда узел входа обнаруживает возврат радара, он направляет это наблюдение в блок MATLAB Function, который отправляет svmIonospherePredict.m
. После предсказания метки и счета модель возвращает эти значения в рабочую область и отображает значения в модели по одному за раз. Когда вы загружаете slexSVMIonospherePredictExample.slx
MATLAB также загружает требуемый набор данных radarReturnInput
. Однако в этом примере показано, как создать необходимый набор данных.
Модель рассчитывает получить входные данные как массив структур, называемый radarReturnInput
содержащие следующие поля:
time
- Точки времени, в которые наблюдения заходят в модель. В примере длительность включает целые числа от 0, хотя и 50. Ориентация должна соответствовать наблюдениям в данных предиктора. Итак, для этого примера time
должен быть вектор-столбец.
signals
- массив структур 1 на 1, описывающий входные данные и содержащий поля values
и dimensions
. values
является матрицей данных предиктора. dimensions
- количество переменных предиктора.
Создайте соответствующий массив структур для будущих радиолокационных возвратов.
radarReturnInput.time = (0:50)'; radarReturnInput.signals(1).values = ftrX; radarReturnInput.signals(1).dimensions = size(ftrX,2);
Вы можете изменить имя из radarReturnInput
, а затем укажите новое имя в модели. Однако Simulink ожидает, что массив структур будет содержать описанные имена полей.
Симулируйте модель с помощью данных, удерживаемых вне обучения, то есть данных в radarReturnInput
.
sim(SimMdlName);
Рисунок показывает модель после того, как она обрабатывает все наблюдения в radarReturnInput
по одному за раз. Предсказанная метка X(351,:)
является 1
и его положительный счет класса 1.431
. Переменные tout
, yout
, и svmlogsout
появится в рабочей области. yout
и svmlogsout
являются SimulinkData.Dataset
объекты, содержащие предсказанные метки и счета. Для получения дополнительной информации смотрите Формат for Logged Simulation Data (Simulink).
Извлеките данные моделирования из журнала симуляции.
labelsSL = svmlogsout.getElement(1).Values.Data; scoresSL = svmlogsout.getElement(2).Values.Data;
labelsSL
является числовым вектором 51 на 1 предсказанных меток. labelsSL(j)
= 1
означает, что модель SVM предсказывает, что радиолокационный возврат j
в будущем выборка хорошего качества, и 0
означает иное. scoresSL
является числовым вектором 51 на 1 счетов положительного класса, то есть расстояний со знаком от контура принятия решения. Положительные счета соответствуют предсказанным меткам 1
, и отрицательные счета соответствуют предсказанным меткам 0
.
Спрогнозируйте метки и счета положительного класса в командной строке с помощью predict
.
[labelCMD,scoresCMD] = predict(Mdl,ftrX); scoresCMD = scoresCMD(:,2);
labelCMD
и scoresCMD
соизмеримы со labelsSL
и scoresSL
.
Сравните счета положительного класса будущей выборки, возвращенные slexSVMIonospherePredictExample
на возвращенные вызовом predict
в командной строке.
err = sum((scoresCMD - scoresSL).^2); err < eps
ans = logical
1
Сумма квадратов отклонений между наборами счетов незначительна.
Если у вас также есть лицензия Simulink Coder™, то можно сгенерировать код С от slexSVMIonospherePredictExample.slx
в Simulink или из командной строки с помощью slbuild
(Simulink). Для получения дополнительной информации см. «Генерация кода С для модели» (Simulink Coder).
learnerCoderConfigurer
| loadLearnerForCoder
| predict
| saveLearnerForCoder
| slbuild
(Simulink)