机器学习—初识SVM(支撑向量机)

SVM

  • Hard Margin SVMta
      • 回忆解析几何,点到直线的距离
    • 引入概念
      • 支撑向量
  • 小结
  • 简单实现

Hard Margin SVMta

回忆解析几何,点到直线的距离

机器学习—初识SVM(支撑向量机)_第1张图片
将线性拓展到n维空间 得到在这里插入图片描述
相应的点到该超平面的距离变成 机器学习—初识SVM(支撑向量机)_第2张图片
在这里插入图片描述

引入概念

机器学习—初识SVM(支撑向量机)_第3张图片
但是很明显发现,按照我们的观察,有一个蓝色的点应该被归为红色才对。由此产生一种思想,叫支撑向量机,SVM尝试寻找一个最优的决策边界距离两个类别的最近的样本最远。
机器学习—初识SVM(支撑向量机)_第4张图片

支撑向量

距离两个类别的最近的样本
上图的三个点,被称为支撑向量

机器学习—初识SVM(支撑向量机)_第5张图片
设最近的点到该决策边界距离为d,则margin为2d
SVM就是要最大化margin即
机器学习—初识SVM(支撑向量机)_第6张图片
利用一些数学推倒,以上公式 (1)可变为有限制的凸优化问题(convex quadratic optimization)
利用 Karush-Kuhn-Tucker (KKT)条件和拉格朗日公式,可以推出MMH可以被表示为以下“决定边界 (decision boundary)”
在这里插入图片描述
并且得出下如下关系机器学习—初识SVM(支撑向量机)_第7张图片
对上下线的公式经处理得到
机器学习—初识SVM(支撑向量机)_第8张图片

则变成一个有条件的求最优化问题

小结

大致的思想是通过支撑向量点(距离两个类别的最近的样本)求他们到一条决策边界相等的最大距离d,获取一个最优的决策边界。

简单实现

import numpy as np
import pylab as pl
from sklearn import svm

# we create 40 separable points
X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
# X = np.r_[np.random.randn(20, 2), np.random.randn(20, 2)]
Y = [0]*20 +[1]*20
print(X)
#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], X[:, 1], c=Y, cmap=pl.cm.Paired)

pl.axis('tight')
pl.show()

你可能感兴趣的:(机器学习,python,支持向量机)