作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/123837009


目录

前言:

第1步骤:导入库

第2步骤:创建线性可数据集

2.1 创建数据集

2.2 可视化数据集

第3步骤:创建线性支持向量机

3.1 建模模型,并进行训练

3.2 获得支持向量

3.3 可视化支持向量

3.4 生成每个输入的样本点到决策边界的距离

第4步骤:通过等高线可视化决策边界与隔离带

4.1 什么是网格

4.2 堆叠

4.3 绘制原始样本和决策边界

4.4 绘制任意等高线

4.5 函数化可视化功能,方便后期的调用


前言:

本文重点不在支持向量机,而在于解读,如何通过等高线,可视化展现决策边界线和隔离带。

第1步骤:导入库

# 导读库
from sklearn import datasets
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

第2步骤:创建线性可数据集

2.1 创建数据集

# 创建数据集
# 生成线性不可分样本点
X, y = datasets.make_blobs(n_samples=50, centers=2, random_state=0,cluster_std=0.6)
print(X.shape)
print(y.shape)
(50, 2)
(50,)

2.2 可视化数据集

#首先要有散点图
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
ax = plt.gca() #获取当前的子图,如果不存在,则创建新的子图

第3步骤:创建线性支持向量机

3.1 建模模型,并进行训练

#建模,通过fit计算出对应的决策边界
clf = SVC(kernel = "linear").fit(X,y)#计算出对应的决策边界

3.2 获得支持向量

#根据决策边界,对X中的样本进行分类,返回的结构为n_samples
y_pred = clf.predict(X)
print(y_pred)#返回给定测试数据和标签的平均准确度
score=clf.score(X,y)
print("score:", score)#返回支持向量坐标(这是支持向量机的名称的来源)
support_vector = clf.support_vectors_
print("支持向量:\n", support_vector)#返回每个类中支持向量的个数
vector_matrix = clf.n_support_ #array([2, 1])
print("支持向量分布", vector_matrix)
[1 1 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 0 0 1 0 1 0 0 0 0 1 10 1 0 1 0 1 1 0 1 1 0 1 0]
score: 1.0
支持向量:[[0.44359863 3.11530945][2.33812285 3.43116792][2.06156753 1.96918596]]
支持向量分布 [2 1]

3.3 可视化支持向量

# 可视化支持向量
# 绘制所有样本点
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")print(support_vector[::,0])
print(support_vector[::,1])
#绘制特定点
plt.scatter(support_vector[::,0],support_vector[::,1],c="black",s=50,cmap="rainbow")
[0.44359863 2.33812285 2.06156753]
[3.11530945 3.43116792 1.96918596]

3.4 生成每个输入的样本点到决策边界的距离

#重要接口decision_function,返回每个输入的样本点到决策边界的距离!!!!
#这个距离作为等高线的高度!!!!
#然后再将这个距离转换为axisx的结构,这是由于画图的函数contour要求Z的结构必须与X和Y保持一致
Z = clf.decision_function(xy).reshape(axisx.shape)
print(Z.shape)
print(Z)
(40, 30)[[ 3.59599448  3.30273116  3.00946785 ... -4.32211513 -4.61537845-4.90864177][ 3.62022649  3.32696317  3.03369985 ... -4.29788313 -4.59114645-4.88440977][ 3.64445849  3.35119517  3.05793185 ... -4.27365112 -4.56691444-4.86017776]...[ 4.49257864  4.19931532  3.90605201 ... -3.42553097 -3.71879429-4.01205761][ 4.51681065  4.22354733  3.93028401 ... -3.40129897 -3.69456229-3.98782561][ 4.54104265  4.24777933  3.95451601 ... -3.37706696 -3.67033028-3.9635936 ]]

z是所有样本点到决策边界的距离,作为等高线的“高”

第4步骤:通过等高线可视化决策边界与隔离带

4.1 什么是网格

位置决策边界,必须先理解网格

#获取平面上两条坐标轴的最大值和最小值
xlim = ax.get_xlim()
ylim = ax.get_ylim()
print(xlim)
print(ylim)#在最大值和最小值之间形成30个规律的数据
# X轴上40个点坐标
# Y轴上30个点坐标
axisx = np.linspace(xlim[0],xlim[1],40)
axisy = np.linspace(ylim[0],ylim[1],30)
print("axisx line", axisx.shape)
print("axisy line",axisy.shape)# 创建网格
# grid后,扩展成平面后,同一个行的40个点,具有不同的x值,具有相同的y值
# grid后,扩展成平面后,同一个行的30个点,具有相同的x值,具有不同的y值
#我们将使用这里形成的二维数组作为我们contour函数中的X和Y
#使用meshgrid函数将两个一维向量转换为特征矩阵
#核心是将两个特征向量广播,以便获取y.shape * x.shape这么多个坐标点的横坐标和纵坐标
axisy,axisx = np.meshgrid(axisy,axisx)
print("axisx mesh:", axisx.shape)
print("axisy mesh:", axisy.shape)#ravel()是降维函数,把二维数据将为一维数据
axisx_r=axisx.ravel()
axisy_r=axisy.ravel()
print("axisx ravel:", axisx_r.shape)
print("axisy ravel:", axisy_r.shape)#vstack能够将多个结构一致的一维数组按行堆叠起来
xy = np.vstack([axisx_r, axisy_r]).T
#xy就是已经形成的网格,它是遍布在整个画布上的密集的点
print("stack:",xy.shape)#第1列xy[:,0]作为x值
#第2列xy[:,1]作为y值
plt.scatter(xy[:,0],xy[:,1],s=1,cmap="rainbow")

4.2 堆叠

#理解函数meshgrid和vstack的作用
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)
print("v1:\n",v1)
print("v2:\n",v2)
v = np.vstack([v1.ravel(), v2.ravel()]).T
print("v:\n",v)
v1:[[1 2 3][1 2 3]]
v2:[[7 7 7][8 8 8]]
v:[[1 7][2 7][3 7][1 8][2 8][3 8]]

4.3 绘制原始样本和决策边界

#首先要有散点图
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")# 绘制支持向量点
plt.scatter(support_vector[::,0],support_vector[::,1],c="black",s=50,cmap="rainbow")#获取当前的子图,如果不存在,则创建新的子图
ax = plt.gca() #画决策边界和平行于决策边界的超平面
# X, Y决定了平面上的坐标点;
# Z 为(X,Y)值对应的高度,不同的高度,特定形状或颜色的线条表示
# 定义三个等高线:到决策边界距离分布为1,0,-1
ax.contour(axisx,axisy, Z,colors="k",levels=[-1,0,1] # 关键地方:三条等高线的对应的Z值:分别是Z值为-1的(X,Y)点,Z值为0和Z为1的(X,Y)点。,alpha= 1.0       # 透明度,决定等高线的颜色深度,linestyles=["--","-","--"])  # 定义三条等高线的形状,ax.set_xlim(xlim) #设置x轴取值
ax.set_ylim(ylim)

4.4 绘制任意等高线

# 绘制任意等高线
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
ax = plt.gca()#通过level指定某一特定的距离(即高度),也即空间点到决策边界的距离
ax.contour(axisx,axisy,Z,colors="k",levels=[-3.33917354],alpha=0.5,linestyles=["--"])

4.5 函数化可视化功能,方便后期的调用

#将上述过程包装成函数:
def plot_svc_decision_function(model,ax=None):if ax is None:ax = plt.gca()xlim = ax.get_xlim()ylim = ax.get_ylim()x = np.linspace(xlim[0],xlim[1],30)y = np.linspace(ylim[0],ylim[1],30)Y,X = np.meshgrid(y,x) xy = np.vstack([X.ravel(), Y.ravel()]).T#获得所有样本点到决策边界的距离,并作为等高线的“高”P = model.decision_function(xy).reshape(X.shape)#绘制登高线ax.contour(X, Y, P,colors="k",levels=[-1,0,1],alpha=0.5,linestyles=["--","-","--"]) ax.set_xlim(xlim)ax.set_ylim(ylim)# 定义支持向量机模型
clf = SVC(kernel = "linear").fit(X,y)# 可视化原始数据
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")# 绘制支持向量点
plt.scatter(support_vector[::,0],support_vector[::,1],c="black",s=50,cmap="rainbow")# 通过自定义函数绘制决策边界以及安全隔离线。
plot_svc_decision_function(clf)

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/123837009


[机器学习与scikit-learn-38]:算法-分类-支持向量机-通过等高线可视化决策边界线和隔离带相关推荐

  1. scikit - learn 做文本分类

    文章来源: https://my.oschina.net/u/175377/blog/84420 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的句子,我以自 ...

  2. 机器学习与Scikit Learn学习库

    摘要: 本文介绍机器学习相关的学习库Scikit Learn,包含其安装及具体识别手写体数字案例,适合机器学习初学者入门Scikit Learn. 在我科研的时候,机器学习(ML)是计算机科学领域中最 ...

  3. 机器学习系列(8)_回归算法,支持向量机

    注:本篇文章参考:b站:机器学习经典算法--回归算法 文章目录 一.机器学习简介 二.回归算法 三.支持向量机要解决的问题 四.支持向量机求解目标 五.核函数变换 一.机器学习简介 机器学习应用的领域 ...

  4. [转载]Scikit Learn: 在python中机器学习

    原址:http://my.oschina.net/u/175377/blog/84420 目录[-] Scikit Learn: 在python中机器学习 载入示例数据 一个改变数据集大小的示例:数码 ...

  5. Scikit Learn: 在python中机器学习

    Warning 警告:有些没能理解的句子,我以自己的理解意译. 翻译自:Scikit Learn:Machine Learning in Python 作者: Fabian Pedregosa, Ga ...

  6. python笔迹识别_python_基于Scikit learn库中KNN,SVM算法的笔迹识别

    之前我们用自己写KNN算法[网址]识别了MNIST手写识别数据 [数据下载地址] 这里介绍,如何运用Scikit learn库中的KNN,SVM算法进行笔迹识别. 数据说明: 数据共有785列,第一列 ...

  7. 收藏!机器学习算法分类图谱及其优缺点综合分析

    来源:必达智库 近日,Coggle对各类机器学习算法进行了归纳整理,形成了一个较为完整的机器学习算法分类图谱,并对每一类算法的优缺点进行了分析.具体分类如下: 正则化算法(Regularization ...

  8. 机器学习的算法分类、优劣比较和选择

    一.机器学习算法分类 (1).监督学习:之所以被称为监督学习,是因为这类算法必须知道预测什么,即目标变量的分类信息.输入数据是由输入特征值和目标值所组成.函数的输出可以是一个连续的值称为回归,输出是有 ...

  9. Python实现GWO智能灰狼优化算法优化支持向量机分类模型(SVC算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 灰狼优化算法(GWO),由澳大利亚格里菲斯大学学者 Mirjal ...

最新文章

  1. 读过本文才算真正了解Cassandra数据库
  2. STM8不用手动复位进入自带Bootloader方法(串口下载)
  3. udp重发机制_UDP 协议
  4. shell 非_Shell基本操作(一)
  5. ArcGis中空间连接join
  6. angular 使用data-bs-datepicker时的一个小问题及解决
  7. c语言编程 float p,C语言编程经典例题
  8. 北妈每日一题:如何甩锅给后端!
  9. A_Pancers团队项目设计完善编码测试
  10. java动态删除map元素报错_java map使用迭代器遍历时执行删除元素报空指针异常
  11. nodejs笔记五--MongoDB基本环境配置及增删改查;
  12. wps文档一敲空格就换行_wps敲空格变成点
  13. 行业:美团将在快手开放平台上线美团小程序
  14. IOT连接阿里云(一):调试MQTT通路
  15. 真人语音朗读软件_讯飞语音云助力移动“和阅读”,打造个性化听书应用
  16. 翻译 API 一句话API
  17. oracle运维常用语句,oracle运维个人常用检查语句整理
  18. 疯壳AI开源无人机PWM(电机控制)
  19. GPS坐标互转:WGS-84(GPS)、GCJ-02(Google地图)、BD-09(百度地图)
  20. 有序广播Ordered broadcasts的使用

热门文章

  1. c语言else if设计一个成绩表,c语言 学生成绩管理系统设计学生成绩信息包括:学号,姓名,三门课程成绩(数学、英语和计算机)等。主要功能:(1) 计算各...
  2. 学生-课程数据库中的Student表中的学号属性为什么用英文Sno表示?
  3. Pygame学习笔记 4 —— 时间与运动
  4. Ribbon与Eureka整合分析(四)、客户端配置延迟加载和启用饥饿加载
  5. 阿里实人认证/活体人脸认证步骤解释一下子 服务端java sdk 手把手 新手 菜 欢迎大佬提意见
  6. 互联网+背景下给旅行社的重大挑战
  7. nodejs+libreoffice 将word转成pdf
  8. 随手记_英语_学术写作_常用近义词区分
  9. 小米组织架构再调整,王川调职,雷军自任中国区总裁
  10. 小高不太行之前端--JSON