本文已参与「新人创造礼」活动,一同敞开创造之路

支撑向量机浅析

支撑向量机(SVM,supportvectormachine)是一种二类分类模型,其基本模型界说为特征空间上的距离最大的线性分类器,其学习战略便是距离最大化,终究可转化为一个凸二次规划问题的求解。

线性分类器

线性回归模型的公式为: y=wTX+b y=w^T X +b

广义线性回归模型的公式为: y=g(wTX+b) y=g(w^T X +b)

分类使命的猜测值是离散的,比方二分类问题,能够用0和1来表明两个类别,经过样本练习,即可得到线性分类器

距离最大超平的意义

咱们的使命是找到一个线性分类器(wTX+bw^T X +b),将样本分开,以图中二维坐标为例,能完结分割使命的有很多条线,如何确认一个最近的线性分类器呢?

泛化功能是分类器好坏的一个重要目标。图中所观察到的样本都是练习样本,咱们希望面临未来的样本数据,分类器也有杰出功能。

支持向量机:原理与python案例

一般而言,相同类别样本的距离较近,一起依据结构危险最小化原则,线性分类器的决议计划鸿沟最大,则鸿沟的泛化差错最小。图中B2的决议计划鸿沟到B2的距离显着小于B1,泛化功能较差。寻找距离最大的超平面,实际上是找部分要害样本点,使得它们到超平面的距离最大。

支持向量机:原理与python案例

线性支撑向量机原理

练习数据集: D={(x_1,y_1),(x_2,y_2),…,(x_n,y_n)},y{-1,+1}

线性分类器决议计划鸿沟的线性方程:y=wTX+b y=w^T X +b,其中w表明超平面的法向量,决议了决议计划鸿沟的方向,b表明位移量,决议了决议计划鸿沟与原点间的距离。

练习数据会集的样本点,假如为正类,那么yi=+1y_i = +1,wTX+b>0 w^T X +b > 0;假如为负类,那么yi=−1y_i = -1,wTX+b<0 w^T X +b < 0;

在练习过程中,咱们能够不断的调整决议计划鸿沟的超参数w和b,总能够得到: {wTxi+b>=+1,yi=+1;wTxi+b<=−1,yi=−1,\begin{cases}w^T x_i +b >=+1 , y_i=+1;\\w^T x_i +b <=-1 , y_i=-1, \end{cases}

此刻,距离决议计划鸿沟最近的样本点,刚好使得上式中等号成立,这些要害样本点,就叫做支撑向量,两个异类支撑向量(要害样本点)之间的距离(margin)称为决议计划鸿沟的“边缘”,这个边缘的距离便是咱们要找的最大距离,决议计划鸿沟B1对应的一组平行的超平面(b11,b12)之间的距离,将距离记为\gamma

将样本点x1,X2x_1,X_2 带入上式,得: {b11:wTx1+b=1;b12:wTx2+b=−1,\begin{cases}b11: w^T x_1 +b =1 ;\\ b12:w^T x_2 +b =-1 , \end{cases}两式相减得:wT(x1−x2)=2 w^T(x_1-x_2)=2, (x1−x2便是x1x2x_1-x_2便是x_1x_2的模乘上夹角余弦值),这儿再改换终究得到 ∥w∥=2\parallel w\parallel \times\gamma=2

支撑向量机的学习便是,寻找参数w,b,使得2∥w∥\frac {2}{\parallel w\parallel}获得最大值。等价于寻找参数w,b,使得12∥w∥2\frac {1}{2}\parallel w\parallel^2获得最小值,优化函数为:yi(wTxi+b)>=1,i=1,2,…,n y_i(w^T x_i +b)>=1,i =1,2,…,n,具体优化函数的求解能够运用拉格朗日乘子法求解。

支持向量机:原理与python案例

事例

事例依据y=0.5x+0.5,y=2.1x+6.5两个函数为基准,引入了较大的随机差错后,各生成了100个样本点。生成的样本有显着的线性鸿沟,咱们尝试运用支撑向量机模型,找出决议计划鸿沟,并进行制作软距离分类决议计划鸿沟。

支持向量机:原理与python案例

from sklearn.svm import LinearSVC
import numpy as np
import pandas as pd
import random
import  matplotlib.pyplot as plt #相似 MATLAB 中绘图函数的相关函数
import seaborn as sns
np.random.seed(2)
count=100
data=[]
for i in range(count):
    x1=np.random.normal(0.00,0.55)
    res1=x1*0.1+0.5+np.random.normal(0.00,0.9)
    data.append([x1,res1,1])
    x2=np.random.normal(0.00,0.55)
    res2=x2*2.1+6.5+np.random.normal(0.00,0.9)
    data.append([x2,res2,0])
data =pd.DataFrame(data)
# print(data[data[2]==1])
x1_data=np.array(data[0])
x2_data=np.array(data[1])
plt.scatter(x1_data,x2_data,c=data[2])
plt.show()
#Pipeline经过将这些数据处理步骤结合成一条算法链,以愈加高效地完结整个机器学习流程
svm_clf = Pipeline(( ("scaler", StandardScaler()),
                     ("linear_svc", LinearSVC(C=1, loss="hinge")) ,))
# 调用linear_svc
svm_clf = svm_clf.fit(data.iloc[:,:2], data[2])
# SVC求解可视化函数
def decision_boundary( model) :
    # 取出两个坐标轴的上下限
    xmin, xmax, ymin, ymax =x1_data.min(), x1_data.max(), x2_data.min(), x2_data.max()
    # 坐标轴等分为50份,共可创建50x50=2500个点
    xloc = np.linspace(xmin, xmax, 50)
    yloc = np.linspace(ymin, ymax, 50)
    # 相当于一个数据仿制的效果,将shape=(n,)的数据变为shape=(n,n)
    xloc, yloc = np.meshgrid(xloc, yloc)
    # 组合坐标点coordinate, 将(n, n)的数据展开成(n*n, )的数据在组合为坐标
    coo = np.vstack([xloc.ravel(), yloc.ravel()]).T
    # 经过decision_function函数计算出每个点到决议计划鸿沟的距离
    dis = model.decision_function(coo)
    # contour要求X,Y,Z具有相同的维度,所以需要将猜测成果reshape
    dis = dis.reshape(xloc.shape)
    # 画出原始数据的散点图
    plt.scatter(x1_data,x2_data, c=y)
    # 增加决议计划鸿沟和两个超平面
    plt.contour(xloc, yloc, dis, alpha=.8, linestyles=['-', '--', '-'], levels=[-1, 0, 1])
    plt.show()
decision_boundary(svm_clf)