目录

  • 一、线性数据处理
    • (一)非标准化原始数据显示
    • (二)绘制决策边界
    • (三)实例化一个SVC并传入超参数C
  • 二、非线性数据处理
    • (一)生成月亮数据集
    • (二)在月亮数据上增加噪声点
    • (三)通过多项式特征的SVM分类
    • (四)高维空间线性SVM处理
  • 三、核函数
    • (一)核函数定义
    • (二)高斯核函数
    • (三)生成测试数据集
    • (四)数据集升维处理
  • 四、超参数问题
    • (一)超参数定义
    • (二)生成数据集
    • (三)定义一个RBF核的SVM
    • (四)准确度

一、线性数据处理

(一)非标准化原始数据显示

Python代码

import numpy as np
import matplotlib.pyplot as pltfrom sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVCiris = datasets.load_iris()X = iris.data
y = iris.targetX = X [y<2,:2] #只取y<2的类别,也就是0 1 并且只取前两个特征
y = y[y<2] # 只取y<2的类别# 分别画出类别0和1的点
plt.scatter(X[y==0,0],X[y==0,1],color='red')
plt.scatter(X[y==1,0],X[y==1,1],color='blue')
plt.show()# 标准化
standardScaler = StandardScaler()standardScaler.fit(X) #计算训练数据的均值和方差
X_standard = standardScaler.transform(X) #再用scaler中的均值和方差来转换X,使X标准化svc = LinearSVC(C=1e9) #线性SVM分类器
svc.fit(X_standard,y) # 训练svm

数据显示结果

(二)绘制决策边界

Python代码

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)# 绘制决策边界
plot_decision_boundary(svc,axis=[-3,3,-3,3]) # x,y轴都在-3到3之间
# 绘制原始数据
plt.scatter(X_standard[y==0,0],X_standard[y==0,1],color='red')
plt.scatter(X_standard[y==1,0],X_standard[y==1,1],color='blue')
plt.show()

运行结果

(三)实例化一个SVC并传入超参数C

Python代码

svc2 = LinearSVC(C=0.01)
svc2.fit(X_standard,y)
plot_decision_boundary(svc2,axis=[-3,3,-3,3]) # x,y轴都在-3到3之间
# 绘制原始数据
plt.scatter(X_standard[y==0,0],X_standard[y==0,1],color='red')
plt.scatter(X_standard[y==1,0],X_standard[y==1,1],color='blue')
plt.show()

运行结果

二、非线性数据处理

(一)生成月亮数据集

Python代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasetsX, y = datasets.make_moons() #使用生成的数据
print(X.shape) # (100,2)
print(y.shape) # (100,)

运行结果

绘图显示月亮数据集:
Python代码

plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

(二)在月亮数据上增加噪声点

Python代码

X, y = datasets.make_moons(noise=0.15,random_state=777) #随机生成噪声点,random_state是随机种子,noise是方差plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

运行结果

(三)通过多项式特征的SVM分类

Python代码

from sklearn.preprocessing import PolynomialFeatures,StandardScaler
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipelinedef PolynomialSVC(degree,C=1.0):return Pipeline([("poly",PolynomialFeatures(degree=degree)),#生成多项式("std_scaler",StandardScaler()),#标准化("linearSVC",LinearSVC(C=C))#最后生成svm])poly_svc = PolynomialSVC(degree=3)
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()

运行结果

(四)高维空间线性SVM处理

可以使用核技巧来对数据进行处理,使其维度提升,使线性不可分的数据在高维空间变成线性可分

Python代码

from sklearn.svm import SVCdef PolynomialKernelSVC(degree,C=1.0):return Pipeline([("std_scaler",StandardScaler()),("kernelSVC",SVC(kernel="poly")) # poly代表多项式特征])poly_kernel_svc = PolynomialKernelSVC(degree=3)
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()

运行结果

三、核函数

(一)核函数定义

核函数包括线性核函数、多项式核函数、高斯核函数等,其中高斯核函数最常用,可以将数据映射到无穷维,也叫做径向基函数(Radial Basis Function 简称 RBF),是某种沿径向对称的标量函数。通常定义为空间中任一点x到某一中心xc之间欧氏距离的单调函数,可记作 k(||x-xc||), 其作用往往是局部的,即当x远离xc时函数取值很小。

(二)高斯核函数

1. 定义
所谓径向基函数 (Radial Basis Function 简称 RBF), 就是某种沿径向对称的标量函数。 通常定义为空间中任一点x到某一中心xc之间欧氏距离的单调函数 , 可记作 k(||x-xc||), 其作用往往是局部的 , 即当x远离xc时函数取值很小。最常用的径向基函数是高斯核函数 ,形式为 k(||x-xc||)=exp{- ||x-xc||2/(2*σ2) } 其中xc为核函数中心,σ为函数的宽度参数 , 控制了函数的径向作用范围。
高斯函数:

高斯核函数:

2. 计算机视觉中的作用
在计算机视觉中,有时也简称为高斯函数。高斯函数具有五个重要的性质,这些性质使得它在早期图像处理中特别有用.这些性质表明,高斯平滑滤波器无论在空间域还是在频率域都是十分有效的低通滤波器,且在实际图像处理中得到了工程人员的有效使用.高斯函数具有五个十分重要的性质,它们是:

(1)二维高斯函数具有旋转对称性,即滤波器在各个方向上的平滑程度是相同的
(2)高斯函数是单值函数
(3)高斯函数的傅立叶变换频谱是单瓣的
(4)高斯滤波器宽度(决定着平滑程度)是由参数σ表征的,而且σ和平滑程度的关系是非常简单的.σ越大,高斯滤波器的频带就越宽,平滑程度就越好
(5)由于高斯函数的可分离性,大高斯滤波器可以得以有效地实现

(三)生成测试数据集

Python代码

import numpy as np
import matplotlib.pyplot as pltx = np.arange(-4,5,1)#生成测试数据
y = np.array((x >= -2 ) & (x <= 2),dtype='int')plt.scatter(x[y==0],[0]*len(x[y==0]))# x取y=0的点, y取0,有多少个x,就有多少个y
plt.scatter(x[y==1],[0]*len(x[y==1]))
plt.show()

运行结果

(四)数据集升维处理

Python代码

# 高斯核函数
def gaussian(x,l):gamma = 1.0return np.exp(-gamma * (x -l)**2)l1,l2 = -1,1
X_new = np.empty((len(x),2)) #len(x) ,2
for i,data in enumerate(x):X_new[i,0] = gaussian(data,l1)X_new[i,1] = gaussian(data,l2)plt.scatter(X_new[y==0,0],X_new[y==0,1])
plt.scatter(X_new[y==1,0],X_new[y==1,1])
plt.show()

运行结果

由上述可见,经过升维处理之后,数据分类变得更加容易了

四、超参数问题

(一)超参数定义

在机器学习的上下文中,超参数是在开始学习过程之前设置值的参数。 相反,其他参数的值通过训练得出。

超参数:

  • 定义关于模型的更高层次的概念,如复杂性或学习能力
  • 不能直接从标准模型培训过程中的数据中学习,需要预先定义
  • 可以通过设置不同的值,训练不同的模型和选择更好的测试值来决定

超参数的一些示例:

  • 树的数量或树的深度
  • 矩阵分解中潜在因素的数量
  • 学习率(多种模式)
  • 深层神经网络隐藏层数
  • k均值聚类中的簇数

高斯函数:


在高斯函数中, σ 越大,分布就越宽

(二)生成数据集

Python代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasetsX,y = datasets.make_moons(noise=0.15,random_state=777)
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

运行结果

(三)定义一个RBF核的SVM

Python代码
γγγ=1

from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import Pipelinedef RBFKernelSVC(gamma=1.0):return Pipeline([('std_scaler',StandardScaler()),('svc',SVC(kernel='rbf',gamma=gamma))])svc = RBFKernelSVC()
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

from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import Pipelinedef RBFKernelSVC(gamma=1.0):return Pipeline([('std_scaler',StandardScaler()),('svc',SVC(kernel='rbf',gamma=gamma))])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()

运行结果

γγγ=10

from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import Pipelinedef RBFKernelSVC(gamma=1.0):return Pipeline([('std_scaler',StandardScaler()),('svc',SVC(kernel='rbf',gamma=gamma))])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()

运行结果

γ\gammaγ取值越大,就是高斯分布的钟形图越窄,这里相当于每个样本点都形成了钟形图。很明显这样是过拟合的。

γ\gammaγ=0.1

from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import Pipelinedef RBFKernelSVC(gamma=1.0):return Pipeline([('std_scaler',StandardScaler()),('svc',SVC(kernel='rbf',gamma=gamma))])svc = RBFKernelSVC(0.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()

运行结果

此时它是欠拟合的,因此,我们可以看出γ\gammaγ 值相当于在调整模型的复杂度。

综上分析,当γ\gammaγ=100时,分类更准确

(四)准确度

python代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasetsboston = datasets.load_boston()
X = boston.data
y = boston.targetfrom sklearn.model_selection import train_test_splitX_train,X_test,y_train,y_test = train_test_split(X,y,random_state=777) # 把数据集拆分成训练数据和测试数据from sklearn.svm import LinearSVR
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScalerdef StandardLinearSVR(epsilon=0.1):return Pipeline([('std_scaler',StandardScaler()),('linearSVR',LinearSVR(epsilon=epsilon))])svr = StandardLinearSVR()
svr.fit(X_train,y_train)svr.score(X_test,y_test) #0.6989278257702748

运行结果

以上就是SVM算法的部分分析,还有疏漏的地方,欢迎大家指正~

基于Python的SVM算法深入研究相关推荐

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

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

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

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

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

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

  4. NLP之ASR:基于python和机器学习算法带你玩转的语音实时识别技术

    NLP之ASR:基于python和机器学习算法带你玩转的语音实时识别技术 导读 带你玩转python实现的语音实时识别技术(包括音频混音.回声消除.噪音滤除.杂音消除.静音检测等方法) 视频观看: 软 ...

  5. 爬虫技术python流程图_基于Python的网络爬虫技术研究

    基于 Python 的网络爬虫技术研究 王碧瑶 [摘 要] 摘要:专用型的网络爬虫能够得到想要的返回结果 , 本文就以拉勾网作 为例子 , 对基于 Python 的网络爬虫技术进行研究和分析. [期刊 ...

  6. python 雪花id_基于python实现雪花算法过程详解

    这篇文章主要介绍了基于python实现雪花算法过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Snowflake是Twitter提出来的一个 ...

  7. python自动化测试平台方案_基于Python的软件测试自动化平台研究

    基于 Python 的软件测试自动化平台研究 沈 啸 [摘 要] 摘要: 21 世纪是计算机和网络技术高速发展的时代,目前我国的软 件行业开发程度明显落后于欧美等发达国家,同时相对于开发工作而言,软件 ...

  8. 基于matlab的数字图像边缘检测算法研究,基于MATLAB数字图像边缘检测算法的研究与对比分析...

    ·161· 居 舍 研究探讨 2017年10月(中) 1 绪论 图像边缘中通常包含着重要的边界信息,这些边界信息便于分析和研究图像.另外,边缘检测可以大大降低图像处 理的工作量,将提高图像分析的效率. ...

  9. 图像去噪算法 matlab,基于Matlab的图像去噪算法的研究与实现

    2009 年第 12 期 福 建 电 脑 (下转第 131 页) 基于 Matlab 的图像去噪算法的研究与实现 胡 鹏 1, 徐会艳 2 (1.淮安信息职业技术学院江苏淮安 223003 2.淮阴师 ...

  10. opencv(python)使用svm算法识别手写数字

    svm算法是一种使用超平面将数据进行分类的算法. 关于mnist数据的解析,读者可以自己从网上下载相应压缩文件,用python自己编写解析代码,由于这里主要研究knn算法,为了图简单,直接使用Kera ...

最新文章

  1. linux 基础知识点杂项记
  2. hdu 2570 迷障(贪心)
  3. JS factory
  4. c语言能让制表符空9个字符码,C语言入门9-1-分类函数
  5. [补档]noip2019集训测试赛(十五)
  6. chrome 内核CEF 编译和qt 封装(下)
  7. echarts官网在线编辑的图表如何导出svg
  8. nrf24l01无线模块c语言程序,NRF24L01 无线通信模块使用
  9. 【iOS与EV3混合机器人编程系列之一】iOS要干嘛?EV3可以更酷!
  10. Simulink建模:LKA系统功能状态机建模
  11. Android 关于佳博和汉印蓝牙热敏打印机开发,安卓databinding
  12. 解决Hexo博客的Next主题中阅读全文没有auto_excerpt的问题
  13. hazelcast java_JVM内存级分布式缓存Hazelcast
  14. 安装VM、CentOS和网络配置
  15. Opencv remap函数
  16. 高效开发工具使用技巧
  17. 项目研发管理实施经验谈(1)
  18. 高博-《视觉SLAM十四讲》
  19. 学计算机u盘多少g合适,装系统的u盘需要多大-大白菜装win7的系统一般要多少G的U?大 – 手机爱问...
  20. 物料帐配置之 重估消耗

热门文章

  1. React context 丢失问题
  2. 解决Mac下Parallels Desktop的Host-only网络问题
  3. 投简历:求求你给我个机会「小废物招聘全记录①」
  4. 63. Event button 事件属性
  5. Android HandlerThread和IntentService
  6. go语言的特殊变量 iota
  7. php 常用正则表达 邮箱 手机号啥的
  8. 50个新的汉化Demo!纯前端 Wijmo 放大招
  9. 面试题38 数字在排序数组中出现的次数
  10. 《Cocos2d-JS开发之旅》重印在即,感谢大家的支持