Објашњен СВМ алгоритам машинског учења

Према ОпенЦВ-овом „Уводу у подршку векторским машинама“, машини за векторску подршку (СВМ):

... је дискриминативни класификатор који је формално дефинисан хиперравнином која раздваја. Другим речима, с обзиром на означене податке о обуци (надгледано учење), алгоритам даје оптималну хиперплан која категорише нове примере.

СВМ функција трошкова настоји да логистичку функцију апроксимира комадно линеарно. Овај алгоритам машинског учења користи се за проблеме класификације и део је подскупа надзираних алгоритама учења.

Функција трошкова

Функција трошкова се користи за обуку СВМ-а. Минимизирањем вредности Ј (тхета), можемо осигурати да СВМ буде што прецизнији. У једначини, функције цост1 и цост0 односе се на трошкове за пример где је и = 1 и трошкове за пример где је и = 0. За СВМ-ове трошак се одређује функцијама језгра (сличности).

Зрна

Полиномске карактеристике имају тенденцију да буду рачунски скупе и могу повећати време извођења са великим скуповима података. Уместо да додајете више полиномских карактеристика, боље је додати оријентире да бисте тестирали близину других тачака података. Сваки члан скупа обуке може се сматрати оријентиром, а језгро је функција сличности која мери колико је улаз приближен наведеним оријентирима.

Класификатор велике марже

СВМ ће пронаћи линију или хиперраван који деле податке са највећом могућом маргином. Иако ће постојати одступања која ће њихати линију у одређеном смеру, Ц вредност која је довољно мала примењиваће регуларизацију током целог.

Следи код написан за обуку, предвиђање и проналажење тачности за СВМ у Питхону:

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