支持向量机(SVM)原理与python实现

支持向量机(SVM)

  • 欢迎观看磐石的博客
    • 第一弹——支持向量机(SVM)
        • 预备数学知识
        • 支持向量机物理机制
        • 函数推导
        • Python代码实现

欢迎观看磐石的博客

机器学习原理与Python实战系列是Scientist在闲暇时间撰写的一个AI系列博客,主要对目前主流的机器学习算法进行透彻的原理剖析,并基于Python语言实现。目的是为了帮助广大网友更深入的理解机器学习,培养大家的兴趣,也是对我自身的一个回顾与提升,欢迎大家前来交流。微信公众号:计算机视觉开发平台

第一弹——支持向量机(SVM)

预备数学知识

  1. 超平面的矩阵函数表示
    一维的直线我们都知道怎么表示,比如y=x+1,它的图像如下图所示。支持向量机(SVM)原理与python实现_第1张图片
    我们把等式右边变为0,得到x-y+1=0。写成矩阵的形式得到支持向量机(SVM)原理与python实现_第2张图片
    进一步转换为
    支持向量机(SVM)原理与python实现_第3张图片
    我们给式子命名,方便理解。令 ω \omega ω=ω
    X=在这里插入图片描述 此处X表示的是一维的列向量,再令b = 1。
    所以,上边的直线方程就可以写成f(x,y) = ω^T * X + b的形式。至于更高维的平面表示,相应的增加矩阵的维度就可以了。
  2. 拉格朗日乘子法
    在很多地方,我们都会碰到附带约束条件的组合优化问题,拉格朗日乘数法是一种寻找变量受一个或多个条件所限制的多元函数的极值的方法。在大学本科的高等数学中我们就学习过,这种方法将一个有n 个变量与k 个约束条件的最优化问题转换为一个有n + k个变量的方程组的极值问题,其变量不受任何约束。将这种方法引入了一种新的标量未知数,即拉格朗日乘数。虽然引入了K个变量,但是我们可以将约束条件写入待优化的式子中,这样问题就转变成了一个没有约束条件的优化问题,可以使用求偏导的方法找到极值。例如下边这个问题支持向量机(SVM)原理与python实现_第4张图片
    这是一个带等式约束的优化问题,有目标值,有约束条件。那么你可以想想,假设这个问题没有约束条件,便可以直接对f的各个x求导,然后令等于0,解x就可以了。可以看到没有约束的话,求导为0,那么各个x均为0,这样f=0了,达到最小值。但是上边优化问题中包含约束条件,当x都为0时不满足约束条件,所以怎么解决呢?
    现在看有约束的问题,既然有了约束不能直接求导,那么如果把约束去掉不就可以了吗?怎么去掉呢?这才需要拉格朗日方法。既然是等式约束,那么我们把这个约束乘一个系数(α1和α2)加到目标函数中去,得到:
    在这里插入图片描述这样就相当于既考虑了原目标函数,也考虑了约束条件 。这时候再求导得到:
    支持向量机(SVM)原理与python实现_第5张图片
    现在有两个变量α1和α2和两个约束条件的等式,可以求出α1和α2,进而求得三个自变量x。
  3. KKT条件
    带约束条件的最优化问题可以分为两种,第一种是约束条件为等式;第二种是约束条件为不等式。第一种我们可以直接应用拉格朗日乘子法进行求解,但是对于第二种,我们不不能将不等式直接带入原优化函数中(因为不等式和等式不一样,带入原优化函数会使得原函数的值发生变化)因此我们要用到KKT条件。那么什么是KKT条件呢?还是举一个具体的例子。支持向量机(SVM)原理与python实现_第6张图片
    先将约束条件转换为在这里插入图片描述
    现在将约束拿到目标函数中去就变成:

在这里插入图片描述
就是如果一个优化问题在转变完后变成在这里插入图片描述
其中g(x)是不等式约束,h(x)是等式约束(这是一种通用表达式,既含有等式约束,也含有不等式约束,α和β均可为零)。KKT条件要使得函数找到最优值,必定满足下面条件:在这里插入图片描述

支持向量机物理机制

支持向量机最初是为了解决线性二分类问题提出的,经过不断改善,现在支持向量机不仅可以解决线性分类的问题,还适用于非线性分类以及小样本训练。对于下图所示的分类问题,三条分类边界我们肉眼便可以判断出肯定中间的C性能最好,因为直线C与边界点之间的间隔是最大的,抗干扰性最强,相比之下A和B的鲁棒性就比较差。支持向量机的核心思想就是做到分类间隔最大支持向量机(SVM)原理与python实现_第7张图片

函数推导

Python代码实现

// SVM Implementation
import numpy as np
from sklearn import svm, datasets
import matplotlib.pyplot as plt


# Read the iris data
iris = datasets.load_iris()
X = iris.data[:, 0:2]
Y = iris['target']
# Creat a SVM model named svc
svc = svm.SVC(kernel='linear', C=10, gamma=0.1)
# Training the model
svc.fit(X, Y)
# Plot
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
h = (x_max / x_min)/100
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
plt.subplot(1, 1, 1)
Result = svc.predict(np.c_[xx.ravel(), yy.ravel()])
Result = Result.reshape(xx.shape)
# Draw contours
plt.contourf(xx, yy, Result, cmap=plt.cm.Paired, alpha=0.8)
# Plot scatters
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)
# set the labels of x axis and y axis
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
# set the length of x axis
plt.xlim(xx.min(), xx.max())
plt.title('SVC with linear kernel')
plt.show()

你可能感兴趣的:(机器学习,机器学习,支持向量机,svm,Python,原理及实现)