Обяснен алгоритъм за машинно обучение на SVM

Според "Въведение в OpenCV за поддръжка на векторни машини", машина за поддръжка на вектор (SVM):

... е дискриминационен класификатор, формално дефиниран от разделяща хиперплан. С други думи, като се имат предвид етикетирани данни за обучение (контролирано обучение), алгоритъмът извежда оптимален хиперплан, който категоризира нови примери.

Функцията за разходи на SVM се стреми да апроксимира логистичната функция с частично линейна. Този алгоритъм за машинно обучение се използва за класификационни проблеми и е част от подгрупата на контролирани алгоритми за обучение.

Функцията на разходите

Функцията за разходи се използва за обучение на SVM. Като минимизираме стойността на J (theta), можем да гарантираме, че SVM е възможно най-точен. В уравнението функциите cost1 и cost0 се отнасят до разходите за пример, където y = 1 и разходите за пример, където y = 0. За SVM разходите се определят от функциите на ядрото (сходство).

Ядки

Полиномиалните характеристики са склонни да бъдат изчислително скъпи и могат да увеличат времето за изпълнение с големи набори от данни. Вместо да добавяте повече полиномиални функции, по-добре е да добавите ориентири, за да тествате близостта на други точки с данни. Всеки член от обучителния набор може да се счита за ориентир, а ядрото е функцията за сходство, която измерва колко близо е даден вход към посочените ориентири.

Класификатор с голям марж

SVM ще намери линията или хиперплана, които разделят данните с възможно най-голям марж. Въпреки че ще има отклонения, които поклащат линията в определена посока, стойността на C, която е достатъчно малка, ще наложи регулиране през цялото време.

По-долу е написан код за обучение, прогнозиране и намиране на точност за SVM в Python:

import numpy as np class Svm (object): """" Svm classifier """ def __init__ (self, inputDim, outputDim): self.W = None # - Generate a random svm weight matrix to compute loss # # with standard normal distribution and Standard deviation = 0.01. # sigma =0.01 self.W = sigma * np.random.randn(inputDim,outputDim) def calLoss (self, x, y, reg): """ Svm loss function D: Input dimension. C: Number of Classes. N: Number of example. Inputs: - x: A numpy array of shape (batchSize, D). - y: A numpy array of shape (N,) where value  0] = 1 ds[np.arange(x.shape[0]),y] = 0 ds[np.arange(x.shape[0]),y] = -np.sum(ds, axis=1) dW = (1/x.shape[0]) * (x.T).dot(ds) dW = dW + (2* reg* self.W) return loss, dW def train (self, x, y, lr=1e-3, reg=1e-5, iter=100, batchSize=200, verbose=False): """ Train this Svm classifier using stochastic gradient descent. D: Input dimension. C: Number of Classes. N: Number of example. Inputs: - x: training data of shape (N, D) - y: output data of shape (N, ) where value < C - lr: (float) learning rate for optimization. - reg: (float) regularization strength. - iter: (integer) total number of iterations. - batchSize: (integer) number of example in each batch running. - verbose: (boolean) Print log of loss and training accuracy. Outputs: A list containing the value of the loss at each training iteration. """ # Run stochastic gradient descent to optimize W. lossHistory = [] for i in range(iter): xBatch = None yBatch = None # - Sample batchSize from training data and save to xBatch and yBatch # # - After sampling xBatch should have shape (batchSize, D) # # yBatch (batchSize, ) # # - Use that sample for gradient decent optimization. # # - Update the weights using the gradient and the learning rate. # #creating batch num_train = np.random.choice(x.shape[0], batchSize) xBatch = x[num_train] yBatch = y[num_train] loss, dW = self.calLoss(xBatch,yBatch,reg) self.W= self.W - lr * dW lossHistory.append(loss) # Print loss for every 100 iterations if verbose and i % 100 == 0 and len(lossHistory) is not 0: print ('Loop {0} loss {1}'.format(i, lossHistory[i])) return lossHistory def predict (self, x,): """ Predict the y output. Inputs: - x: training data of shape (N, D) Returns: - yPred: output data of shape (N, ) where value < C """ yPred = np.zeros(x.shape[0]) # - Store the predict output in yPred # s = x.dot(self.W) yPred = np.argmax(s, axis=1) return yPred def calAccuracy (self, x, y): acc = 0 # - Calculate accuracy of the predict value and store to acc variable yPred = self.predict(x) acc = np.mean(y == yPred)*100 return acc