支持向量机

一、概述

支持向量机(SVM,也称为支持向量网络),SVM在各种实际问题中都表现非常优秀。它在手写识别数字和人脸识别中应用广泛,在文本和超
文本的分类中举足轻重,因为SVM可以大量减少标准归纳(standard inductive)和转换设置(transductive
settings)中对标记训练实例的需求。同时,SVM也被用来执行图像的分类,并用于图像分割系统。

二、支持向量机分类器的工作原理

支持向量机的分类方法,是在这组分布中找出一个超平面作为决策边界,使模型在数据上的
分类误差尽量接近于小,尤其是在未知数据集上的分类误差(泛化误差)尽量小。拥有更大
边际的决策边界在分类中的泛化误差更小,这一点可以由结构风险最小化定律来证明(SRM)。如果边际很小,则
任何轻微扰动都会对决策边界的分类产生很大的影响。边际很小的情况,是一种模型在训练集上表现很好,却在测
试集上表现糟糕的情况,所以会“过拟合”。所以我们在找寻决策边界的时候,希望边际越大越好

三、线性SVM决策过程的可视化

1、 实例化数据集,可视化数据集
from sklearn.datasets import make_blobs 
from sklearn.svm import SVC
import matplotlib.pyplot as plt 
import numpy as np

X,y = make_blobs(n_samples=50, centers=2, random_state=0,cluster_std=0.6) 
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
plt.xticks([])
plt.yticks([]) 
plt.show()

在这里插入图片描述

2、定义画决策边界的函数
#首先要有散点图
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
ax = plt.gca() #获取当前的子图,如果不存在,则创建新的子图
xlim = ax.get_xlim()
ylim = ax.get_ylim() #默认创建(0.0, 1.0)范围内的横纵坐标
#要画决策边界,必须要有网格
axisx = np.linspace(xlim[0],xlim[1],30)
axisy = np.linspace(ylim[0],ylim[1],30)
axisy,axisx = np.meshgrid(axisy,axisx)
#将特征向量转换为特征矩阵的函数
#核心是将两个特征向量广播,以便获取y.shape * x.shape这么多个坐标点的横坐标和纵坐标
xy = np.vstack([axisx.ravel(), axisy.ravel()]).T
#获取y.shape * x.shape这么多个坐标点
#其中ravel()是降维函数,vstack能够将多个结构一致的一维数组按行堆叠起来
#xy就是已经形成的网络,它是遍布在整个画布上的密集的点
a = np.array([1,2,3])
b = np.array([7,8])
#两两组合,会得到多少个坐标?
#答案是6个,分别是 (1,7),(2,7),(3,7),(1,8),(2,8),(3,8)
v1,v2 = np.meshgrid(a,b)



v = np.vstack([v1.ravel(), v2.ravel()]).T

#建模,通过fit计算出对应的决策边界

clf = SVC(kernel = "linear").fit(X,y)

P = clf.decision_function(xy).reshape(axisx.shape)

#重要接口decision_function,返回每个输入的样本所对应的到决策边界的距离

#然后再将这个距离转换为axisx的结构

#画决策边界和平行于决策边界的超平面 
ax.contour(axisx,axisy,P

           ,colors="k"

           ,levels=[-1,0,1]

           ,alpha=0.5

           ,linestyles=["--","-","--"])

ax.set_xlim(xlim) 
ax.set_ylim(ylim)


(-0.43660961990940284, 5.772756283035797)

在这里插入图片描述

3、乳腺癌数据集下探索核函数的性质

from sklearn.datasets import load_breast_cancer
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np

data = load_breast_cancer()
X = data.data
y = data.target
X.shape
np.unique(y)
plt.scatter(X[:,0],X[:,1],c=y)
plt.show()
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=420)

Kernel = ["linear","rbf","sigmoid"]

for kernel in Kernel: 
    clf= SVC(kernel = kernel
             , gamma="auto" # , degree = 1
             , cache_size=5000
             ).fit(Xtrain,Ytrain)
    print("The accuracy under kernel %s is %f" % (kernel,clf.score(Xtest,Ytest))) 

在这里插入图片描述

The accuracy under kernel linear is 0.929825
The accuracy under kernel rbf is 0.596491
The accuracy under kernel sigmoid is 0.596491

乳腺癌数据集是一个线性数据集,线性核函数跑出来的效果很好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值