文章目录

  • 一、SVM算法
  • 二、算法实现
    • 1.引包
    • 2.加载数据
    • 3.修改数据
    • 4.定义函数
    • 5.线性处理
    • 6.非线性处理
    • 7.核函数处理
    • 8.高斯核函数处理
  • 三、总结
  • 四、参考

一、SVM算法

将实例的特征向量(以二维为例)映射为空间中的一些点,如下图的实心点和空心点,它们属于不同的两类。SVM 的目的就是想要画出一条线,以“最好地”区分这两类点,以至如果以后有了新的点,这条线也能做出很好的分类。

二、算法实现

1.引包

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.preprocessing import PolynomialFeatures,StandardScaler
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC

2.加载数据

#使用生成的数据
X, y = datasets.make_moons()
#展示数据
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

3.修改数据

#随机生成噪声点,random_state是随机种子,noise是方差
X, y = datasets.make_moons(noise=0.15,random_state=520) #展示处理过后的数据
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

4.定义函数

#非线性SVM分类,当degree为0表示线性
def PolynomialSVC(degree,C=1.0):return Pipeline([("poly",PolynomialFeatures(degree=degree)),#生成多项式("std_scaler",StandardScaler()),#标准化("linearSVC",LinearSVC(C=C))#最后生成svm])#绘制决策边界
def plot_decision_boundary(model, axis):x0, x1 = np.meshgrid(np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1,1),np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1,1))X_new = np.c_[x0.ravel(), x1.ravel()]y_predict = model.predict(X_new)zz = y_predict.reshape(x0.shape)from matplotlib.colors import ListedColormapcustom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])    plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)#核函数
def PolynomialKernelSVC(degree,C=1.0):return Pipeline([("std_scaler",StandardScaler()),("kernelSVC",SVC(kernel="poly")) # poly代表多项式特征])#高斯核函数
def RBFKernelSVC(gamma=1.0):return Pipeline([('std_scaler',StandardScaler()),('svc',SVC(kernel='rbf',gamma=gamma))])

5.线性处理

#线性处理,c=1
poly_svc = PolynomialSVC(degree=1,C=1)
poly_svc.fit(X,y)
plot_decision_boundary(poly_svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

#线性处理,c=100
poly_svc = PolynomialSVC(degree=1,C=100)
poly_svc.fit(X,y)
plot_decision_boundary(poly_svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()


可以发现修改惩罚系数没有变化。

6.非线性处理

#非线性处理
poly_kernel_svc = PolynomialSVC(degree=5,C=1)
poly_kernel_svc.fit(X,y)
plot_decision_boundary(poly_kernel_svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()


#非线性处理
poly_kernel_svc = PolynomialSVC(degree=5,C=100)
poly_kernel_svc.fit(X,y)
plot_decision_boundary(poly_kernel_svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()


可以发现修改惩罚系数对于结果有影响

7.核函数处理

#核函数处理
poly_kernel_svc = PolynomialKernelSVC(degree=5)
poly_kernel_svc.fit(X,y)
plot_decision_boundary(poly_kernel_svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

#核函数处理
poly_kernel_svc = PolynomialKernelSVC(degree=50)
poly_kernel_svc.fit(X,y)
plot_decision_boundary(poly_kernel_svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()


通过修改核函数参数,发现结果无变化

8.高斯核函数处理

#高斯核处理 参数为1
svc = RBFKernelSVC(1)
svc.fit(X,y)
plot_decision_boundary(svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

#高斯核处理 参数为10
svc = RBFKernelSVC(10)
svc.fit(X,y)
plot_decision_boundary(svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

#高斯核处理 参数为100
svc = RBFKernelSVC(100)
svc.fit(X,y)
plot_decision_boundary(svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

可以发现通过改变超参数结果有明显变化,随着参数变大,拟合结果不断增大.最后出现过拟合情况.

三、总结

SVM优点:

(1)非线性映射是SVM方法的理论基础,SVM利用内积核函数代替向高维空间的非线性映射;

(2)对特征空间划分的最优超平面是SVM的目标,最大化分类边际的思想是SVM方法的核心;

(3)支持向量是SVM的训练结果,在SVM分类决策中起决定作用的是支持向量。

(4)SVM 是一种有坚实理论基础的新颖的小样本学习方法。它基本上不涉及概率测度及大数定律等,因此不同于现有的统计方法。从本质上看,它避开了从归纳到演绎的传统过程,实现了高效的从训练样本到预报样本的“转导推理”,大大简化了通常的分类和回归等问题。

(5)SVM 的最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。

(6)少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本、“剔除”大量冗余样本,而且注定了该方法不但算法简单,而且具有较好的“鲁棒”性。这种“鲁棒”性主要体现在:

①增、删非支持向量样本对模型没有影响;

②支持向量样本集具有一定的鲁棒性;

③有些成功的应用中,SVM 方法对核的选取不敏感

SVM缺点:

(1) SVM算法对大规模训练样本难以实施

由于SVM是借助二次规划来求解支持向量,而求解二次规划将涉及m阶矩阵的计算(m为样本的个数),当m数目很大时该矩阵的存储和计算将耗费大量的机器内存和运算时间。针对以上问题的主要改进有有J.Platt的SMO算法、T.Joachims的SVM、C.J.C.Burges等的PCGC、张学工的CSVM以及O.L.Mangasarian等的SOR算法

(2) 用SVM解决多分类问题存在困难

经典的支持向量机算法只给出了二类分类的算法,而在数据挖掘的实际应用中,一般要解决多类的分类问题。可以通过多个二类支持向量机的组合来解决。主要有一对多组合模式、一对一组合模式和SVM决策树;再就是通过构造多个分类器的组合来解决。主要原理是克服SVM固有的缺点,结合其他算法的优势,解决多类问题的分类精度。如:与粗集理论结合,形成一种优势互补的多类问题的组合分类器。

四、参考

https://blog.csdn.net/qq_42451251/article/details/106340722

基于Sklearn实现SVM算法相关推荐

  1. ML之SVM:基于sklearn的svm算法实现对支持向量的数据进行标注

    ML之SVM:基于sklearn的svm算法实现对支持向量的数据进行标注 目录 输出结果 实现代码 输出结果 实现代码 import numpy as np import matplotlib.pyp ...

  2. 第十九课.基于sklearn的SVM人脸识别

    目录 数据集 确定人脸的类别标记 划分训练集和测试集与训练 实验为基于sklearn的SVM人脸识别,使用 SVM 算法对戴眼镜的人脸和不戴眼镜的人脸进行分类,从而完成 识别戴眼镜的人脸 的任务:实验 ...

  3. mser python车牌识别_基于MSER与SVM算法的车牌定位识别方法

    基于 MSER 与 SVM 算法的车牌定位识别方法 胡成伟 ; 袁明辉 [期刊名称] <软件> [年 ( 卷 ), 期] 2020(041)002 [摘要] 针对实际车牌识别系统中车牌位置 ...

  4. python基于sklearn的SVM和留一法(LOOCV)进行二分类

    基于sklearn的SVM和留一法(LOOCV)进行二分类 需要的导入包 import numpy as np from sklearn.model_selection import LeaveOne ...

  5. 基于OpenCV的 SVM算法实现数字识别(四)---代码实现

    三.基于SVM算法实现手写数字识别 作为一个工科生,而非数学专业的学生,我们研究一个算法,是要将它用于实际领域的.下面给出基于OpenCV3.0的SVM算法手写数字识别程序源码(参考http://bl ...

  6. 基于sklearn随机森林算法探究肥胖的成因

    目录 项目背景 数据介绍 数据来源 属性介绍 算法介绍 随机森林算法 决策树 随机森林定义 随机森林构建过程 随机森林算法评价 随机森林算法的发展现状及趋势 实验步骤 1.导入模块与数据 2.查看数据 ...

  7. 基于sklearn随机森林算法对鸢尾花数据进行分类

    随机森林定义 随机森林(Random Forest,RF),顾名思义就是将多棵相互之间并无关联的决策树整合起来形成一个森林,再通过各棵树投票或取均值来产生最终结果的分类器.在介绍随机森林前需要了解几个 ...

  8. ML之SVM:SVM算法的简介、应用、经典案例之详细攻略

    ML之SVM:SVM算法的简介.应用.经典案例之详细攻略 目录 SVM算法的简介 1.SVM模型分类-线性可分.线性.非线性 2.SVM的决策边界 3.SVM中的核函数 4.SVM算法推导 1.1.S ...

  9. sklearn应用线性回归算法

    sklearn应用线性回归算法 Scikit-learn 简称 sklearn 是基于 Python 语言实现的机器学习算法库,它包含了常用的机器学习算法,比如回归.分类.聚类.支持向量机.随机森林等 ...

最新文章

  1. 马尔科夫、最大熵、条件随机场
  2. word文档如何画线条流程图_如何将Word文档拆分成多个文件?
  3. python删除空白没有显示_删除Python字符串中的空白
  4. Oracle找出需要建立索引的表
  5. android glide加载不出图片_Glide实现共享元素无缝转场效果,只需四步!
  6. ListView的CheckBox实现全部选中/不选中
  7. Liunx CentOS6编译安装LAMP
  8. 在ubuntu16.04-32bits 下编译vlc和vlc-qt开源项目
  9. c#变量初始化的学习
  10. ABB机器人Whlie循环指令
  11. 痘痘告诉你,身体哪里生病了
  12. jquery 实现的省市区级联,无ajax
  13. 空气质量指数计算公式
  14. 小芳同学的错题总结(十四)
  15. JavaScript如何输入输出之如何使用JavaScript优雅编程
  16. 如何做好项目沟通管理的工作
  17. bex5中的常用方法总结
  18. 机器学习笔记---从极大似然估计的角度看待Logistic回归
  19. 【设计模式2_工厂模式、策略模式】
  20. Docker删除指定镜像

热门文章

  1. 泛微E9 插入代码行改变明细行颜色
  2. [极客大挑战 2019]Upload(菜刀连接文件上传出现: HTTP/1.1 200 OK)
  3. 【SpringSSM项目】搏击俱乐部 主页导航栏 用户退出登录
  4. 【seeprettyface.com】数据集:黄种人/动漫人物/自拍照/网红脸人脸数据集
  5. UEditor富文本编辑器上传图片打不开,提示“后端配置项没有正常加载,上传插件不能正常使用”
  6. 利用CS4.0和FRP拿下“打牌”网站服务器
  7. 靠AI六小时开发出游戏Demo,剧本绘画配音一条龙,网友:新概念3“A”大作
  8. 计算机网络教程第5版-第3章数据链路层(数据链路层)
  9. 删除oracle中的一列数据,Oracle删除表数据
  10. linux 内核dmesg,linux内核调试kmsg,dmesg