«Это 12-й день моего участия в ноябрьском испытании обновлений, ознакомьтесь с подробностями события:Вызов последнего обновления 2021 г."
Обзор машин опорных векторов
Машина опорных векторов (SVM) — это своего рода обобщенный линейный классификатор (обобщенный линейный классификатор), который выполняет двоичную классификацию данных в соответствии с обучением с учителем, а его граница решения — это максимальный запас для решения обучающей выборки.Гиперплоскость с максимальным запасом . По сравнению с логистической регрессией и нейронными сетями машины опорных векторов обеспечивают более чистый и эффективный способ изучения сложных нелинейных уравнений.
Мягкий интервал, жесткий интервал и нелинейные SVM
Если данные полностью линейно разделимы, изученную модель можно назвать SVM с жесткими границами. Другими словами, жесткий интервал относится к ситуации, когда классификация полностью точна и нет ошибочной классификации. Мягкая маржа предназначена для того, чтобы допустить определенное количество ошибок классификации выборки.
Идея алгоритма машины опорных векторов
Найдите некоторые данные на краю набора (называемом опорным вектором) и используйте эти точки, чтобы найти плоскость (называемую поверхностью решения), чтобы расстояние между опорным вектором и плоскостью было наибольшим.
Базовые знания о гиперплоскости: Любая гиперплоскость может быть описана следующим линейным уравнением: ?2) (2 означает квадрат), после расширения до ?-мерного пространства расстояние от точки ? = (?1, ?2 … ??) до гиперплоскости ??? + ? = 0 равно: |???+?| / ||?|| |? || =(корень результата)
Линейная разделительная векторная машина
В гиперплоскости формула линейной разделимой векторной машины выглядит следующим образом:
где ? - множитель Лагранжа
? =E[m,i=1]??????
E[m,i=1]??*?? =0
Боевая машина с линейным разделимым вектором
После применения линейно разделимого алгоритма к данным визуализируйте его. Реализовано с использованием алгоритма svm в библиотеке sklearn. Набор данных выглядит следующим образом:
#coding=gbk
import numpy as np
import pylab as pl
from sklearn import svm
def loadDataSet(fileName):
dataMat = []; labelMat = []
fr = open(fileName)
for line in fr.readlines(): #逐行读取,滤除空格等
lineArr = line.strip().split('\t')
dataMat.append([float(lineArr[0]), float(lineArr[1])]) #添加数据
labelMat.append(float(lineArr[2])) #添加标签
return dataMat,labelMat
X,Y = loadDataSet('datasets_testSet.txt')
#fit the model
clf = svm.SVC(kernel='linear')
clf.fit(X, Y)
# get the separating hyperplane
w = clf.coef_[0]
a = -w[0]/w[1]
xx = np.linspace(-5, 5)
yy = a*xx - (clf.intercept_[0])/w[1]
# plot the parallels to the separating hyperplane that pass through the support vectors
b = clf.support_vectors_[0]
yy_down = a*xx + (b[1] - a*b[0])
b = clf.support_vectors_[-1]
yy_up = a*xx + (b[1] - a*b[0])
print ("w: ", w)
print ("a: ", a)
# print "xx: ", xx
# print "yy: ", yy
print ("support_vectors_: ", clf.support_vectors_)
print ("clf.coef_: ", clf.coef_)
# switching to the generic n-dimensional parameterization of the hyperplan to the 2D-specific equation
# of a line y=a.x +b: the generic w_0x + w_1y +w_3=0 can be rewritten y = -(w_0/w_1) x + (w_3/w_1)
# plot the line, the points, and the nearest vectors to the plane
pl.plot(xx, yy, 'k-')
pl.plot(xx, yy_down, 'k--')
pl.plot(xx, yy_up, 'k--')
pl.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],
s=80, facecolors='none')
pl.scatter([x[0] for x in X], [x[1] for x in X], c=Y, cmap=pl.cm.Paired)
pl.axis('tight')
pl.show()
Результат выглядит следующим образом: