机械学习:二维空间下支持向量机SVM基础学习

目录

1、支持向量机介绍

2、问题描述

3、SVM操作

3.1 sklearn.svm.SVC 参数说明

3.2 代码实现


1、支持向量机介绍

        支持向量机(Support Vector Machine,SVM)是一类按监督学习方式对数据进行二元分类的广义线性分类器,是一个最大间隔分类器(Max Margin Classifier), 是最有效的监督学习方法之一, 经常被作为文本处理方法的一个强基准模型(strong baseline)。其基本模型是定义在特征空间上的间隔最大的线性分类器。SVM算法还包括核函数,核函数可以使它成为非线性分类器。

2、问题描述

        由于SVM是一类对数据进行二元分类,即将平面分划为两部分,并用正类和负类进行分类标记。若用直线把平面分成两部分,就要找一条直线;若用曲线进行分类,则需找到一条曲线。

         我们知道,在线性可分的情况下,有无穷多个满足条件的超平面,但哪个最好呢?SVM用线性分类器的间隔(Margin)进行评定,间隔越大,说明分类效果越好。在分类界面两侧分别放置平行于分类超平面的一个超平面,平行移动超平面,当他们各自第一次碰到数据点时,他们之间的距离就被称为线性分类器的间隔。

3、SVM操作

        由于 SVM 数学原理较复杂,且SVM算法本身的实现也非常复杂,因此在实际问题中,SVM的实现是直接用sklearn库。

3.1 sklearn.svm.SVC 参数说明

语法结构:sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False,tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=None,random_state=None)

主要调节的参数有:C、kernel、degree、gamma、coef0

C:C-SVC的惩罚参数C,默认值是1.0。C越大,对误分类的惩罚越大,训练集测试的准确率就越高,但泛化能力弱。C值越小,对误分类的惩罚减小,允许容错,泛化能力较强。

kernel :核函数,默认是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ 

        linear:线性核函数,是在数据线性可分的情况下使用的,运算速度快,效果好。不足在于它不能处理线性不可分的数据。
        poly:多项式核函数,多项式核函数可以将数据从低维空间映射到高维空间,但参数比较多,计算量大。
        rbf:高斯核函数(默认),高斯核函数同样可以将样本映射到高维空间,但相比于多项式核函数来说所需的参数比较少,通常性能不错,所以是默认使用的核函数。
        sigmoid:sigmoid 核函数,sigmoid 经常用在神经网络的映射中。因此当选用 sigmoid 核函数时,SVM 实现的是多层神经网络。    

degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。

gamma: ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features

coef0:核函数的常数项。对于‘poly’和 ‘sigmoid’有用。

3.2 代码实现

from sklearn import svm
import numpy as np
import matplotlib.pyplot as plt


# 创建 40 个点,要求线性可分
np.random.seed(0)  # 保证生成的随机数不变

# np._r表示将矩阵在行方向上进行相连、random.randn(a,b)表示生成a行b列的矩阵,且随机数服从标准正态分布
# array(20,2)-[2,2]相当于给每一行的两个数都减去 2
X= np.r_[np.random.randn(20,2)-[2,2], np.random.randn(20,2)+[2,2]] #array(20,2)-[2,2]相当于给坐标值都减去2,加减2的原因是将数据分开,更好分别
Y=[0]*20+[1]*20 #用0和1用于后续对两类数据进行标签

#调用svm计算w和b
clf=svm.SVC(kernel='linear')
clf.fit(X,Y)

# y=-(w0/w1)x-(b/w1)
w=clf.coef_[0]  # w是一个二维数据,coef就是w=[w0,w1]
a=-w[0]/w[1]  # 斜率

xx=np.linspace(-5,5)  #从-5到5随机的产生一些连续的值
yy=a*xx-(clf.intercept_[0])/w[1]  # .intercept[0]获取b的值,b/w[1]是截距用来获得截距(这里共有两个值,分别为到x轴和到y轴的截距)

# 画出和划分超平面平行且经过支持向量的两条线(斜率相同,截距不同)
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("support_vectors_: ", clf.support_vectors_)
print("clf.coef_: ", clf.coef_)

# 在 scikit-learin 中,coef_ 保存了线性模型中划分超平面的参数向量。形式为(n_classes, n_features)。若 n_classes > 1,则为多分类问题,(1,n_features) 为二分类问题。

# 绘制划分超平面,边际平面和样本点
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)

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

 运行结果

 

 sklearn学习网站:sklearn中文文档

本文仅供学习交流

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值