SVM отлично подходят для классификации данных, вы видите много биномиальных примеров. Вот вам хороший полиномиальный пример в Matlab…

Если вы попали сюда и плохо разбираетесь в SVM, то сначала прочтите эту статью.

Начнем с хорошего набора данных.

Набор данных о цветке ириса представляет собой многомерный набор данных, представленный британским статистиком и биологом Рональдом Фишером в его статье 1936 года Использование множественных измерений в таксономических задачах. Его иногда называют набором данных об ирисах Андерсона, потому что Эдгар Андерсон собрал данные для количественной оценки морфологических вариаций цветков ирисов трех родственных видов. Набор данных состоит из 50 образцов каждого из трех видов ириса (Iris Setosa, Iris virginica и Iris versicolor). У каждого образца измеряли четыре характеристики: длину и ширину чашелистиков и лепестков в сантиметрах. Скачать можно с Kaggle.

Загрузите набор данных

Наш первый шаг — загрузить набор данных и нормализовать наши функции для повышения производительности. При создании y давайте воспользуемся grp2idx для преобразования вида в число.

%% Loading our dataset
clear;
tbl = readtable(‘IRIS.csv’);
[m,n] = size(tbl);
X = tbl{:,1:n-1};
[y,labels] = grp2idx(tbl{:,n});
nl = length(labels);
[X_norm, mu, sigma] = featureNormalize(X);

Разделить обучающие и тестовые наборы данных

Давайте разделим наш набор данных на тренировочный и тестовый наборы, обязательно рандомизируя их по мере продвижения. Сплит будет 80/20.

%% split up train, cross validation and test set
rand_num = randperm(size(X,1));
X_train = X(rand_num(1:round(0.8*length(rand_num))),:);
y_train = y(rand_num(1:round(0.8*length(rand_num))),:);
X_test = X(rand_num(round(0.8*length(rand_num))+1:end),:);
y_test = y(rand_num(round(0.8*length(rand_num))+1:end),:);
cv = cvpartition(y_train,’k’,5);

Выбор функций

Нам нужно решить, какие функции нам лучше всего использовать, поэтому давайте позволим sequencefs сделать всю работу за нас. Тем не менее, sequencefs нуждается в функции стоимости, которая определена как встроенный функционал под названием costfun. Эта функция использует функция Matlab ‘loss для оценки ошибки классификации для каждой модели. Наконец, удалите ненужные столбцы

%% feature selection
opts = statset(‘display’,’iter’);
costfun = @(XT,yT,Xt,yt)loss(fitcecoc(XT,yT),Xt,yt);
[fs, history] = sequentialfs(costfun, X_train, y_train, ‘cv’, cv, ‘options’, opts); 
% Remove unwanted columns
X_train = X_train(:,fs);
X_test = X_test(:,fs);

После запуска выбора функции вы должны увидеть выбранные столбцы [1 3 4]. Это небольшой набор данных, вы можете получить другие результаты, но я уверен, что вы поняли идею ;-). Если вы запустите corrplot([X y]), посмотрите на нижнюю строку, и вы поймете, почему 1, 3 и 4 имеют наилучший результат для Y.

Обучить SVM

В Matlab есть замечательная функция fitcecoc, которая подходит для многоклассовых моделей для SVM от нашего имени.

ОТЛИЧНО…. нам не нужно заниматься математикой….

Мы решили использовать гауссово ядро ​​для оценки нашей модели. Я объясняю гауссовский здесь, если вам нужно введение. Затем давайте используем функцию потерь для расчета нашей точности.

%% check loss against test dataset
t = templateSVM(‘KernelFunction’,’gaussian’);
mdl = fitcecoc(X_train, y_train,’Learners’,t,’Coding’,’onevsone’);
L = loss(mdl,X_test,y_test) * 100

Если были выбраны столбцы [1 3 4], вы должны увидеть потерю 0%.

Предсказания

Итак, теперь мы знаем, что у нас 100% точность, так как потери равны 0%. В Matlab также есть удобная функция predict, которая помогает нам делать прогнозы. Ниже нам нужно использовать наши mu и sigma из featureNormalize, чтобы убедиться, что наш масштаб правильный. Мы прогнозируем результат, когда функции [5,2 3,5 1,2 0,3].

%% Predict a result
px = bsxfun(@minus, [5.2 3.5 1.2 0.3], mu);
px = bsxfun(@rdivide, px, sigma);
predict(mdl,px([1 3 4]))

Все идет хорошо, ваш результат «1», то есть «Iris-setosa».

Вывод

Хотя мы рассмотрели здесь немного больше деталей, полиномиальное SVM — это несложное уравнение для использования в Matlab. Как всегда, все дело в данных, поэтому наличие хорошего набора данных является ключевым.