Предсказание меток классов с помощью блока MATLAB function

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

Задайте функцию 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

Создайте модель Simulink с блоком MATLAB Function, который отправляет в svmIonospherePredict.m.

Этот пример предоставляет модель Simulink slexSVMIonospherePredictExample.slx. Откройте модель Simulink.

SimMdlName = 'slexSVMIonospherePredictExample'; 
open_system(SimMdlName)

Рисунок отображает модель Simulink. Когда узел входа обнаруживает возврат радара, он направляет это наблюдение в блок MATLAB Function, который отправляет svmIonospherePredict.m. После предсказания метки и счета модель возвращает эти значения в рабочую область и отображает значения в модели по одному за раз. Когда вы загружаете slexSVMIonospherePredictExample.slxMATLAB также загружает требуемый набор данных 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).

См. также

| | | | (Simulink)

Похожие темы