Пояснено алгоритм машинного навчання SVM

Відповідно до «Введення в підтримку векторних машин» OpenCV, машина підтримки векторних елементів (SVM):

... - це дискримінаційний класифікатор, формально визначений розділовою гіперплощиною. Іншими словами, враховуючи позначені навчальні дані (контрольоване навчання), алгоритм виводить оптимальний гіперплан, який класифікує нові приклади.

Функція витрат SVM прагне апроксимувати логістичну функцію з кусково лінійною. Цей алгоритм машинного навчання використовується для класифікаційних задач і є частиною підмножини керованих алгоритмів навчання.

Функція витрат

Функція витрат використовується для навчання SVM. Мінімізуючи значення J (тета), ми можемо гарантувати, що 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