线性 SVM 决策过程的可视化

导入模块

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.5)
# plt.scatter(x[:, 0], x[:, 1], c=y, cmap="rainbow")
# plt.xticks([])
# plt.yticks([])

画决策边界

# 首先要有散点图
plt.scatter(x[:, 0], x[:, 1], c=y, s=50, cmap="rainbow")
# 获取当前的子图,如果不存在,则创建新的子图
ax = plt.gca() # 获取平面上两条坐标轴的最大值和最小值
xlim = ax.get_xlim() # (-0.46507821433712176, 3.1616962549275827)
ylim = ax.get_ylim() # (-0.22771027454251097, 5.541407658378895) # 在最大值和最小值之间形成30个规律的数据
axisx = np.linspace(xlim[0], xlim[1], 30) # shape(30,)
axisy = np.linspace(ylim[0], ylim[1], 30) # shape(30,) # 将axis(x, y)转换成二维数组
axisx, axisy = np.meshgrid(axisx, axisy) # axisx, axisy = shape((30, 30) # 将axisx, axisy 组成 900 * 2 的数组
xy = np.vstack([axisx.ravel(), axisy.ravel()]).T # shape(900, 2) # 展示xy画出的网格图
# plt.scatter(xy[:, 0], xy[:, 1], s=1, c="grey", alpha=0.3)



建模,计算决策边界并找出网格上每个点到决策边界的距离

# 建模,通过fit计算出对应的决策边界
clf = SVC(kernel="linear").fit(x, y) # 重要接口decision_function,返回每个输入的样本所对应的到决策边界的距离
z = clf.decision_function(xy).reshape(axisx.shape) # shape(30, 30) plt.scatter(x[:, 0], x[:, 1], c=y, s=50, cmap="rainbow")
ax = plt.gca() # 画决策边界和平行于决策边界的超平面
ax.contour(
axisx,
axisy,
z,
colors="k",
levels=[-1, 0, 1],
linestyles=["--", "-", "--"],
alpha=0.5,
) # 设置xyk刻度
ax.set_xlim(xlim)
ax.set_ylim(ylim)
(-0.22771027454251097, 5.541407658378895)



将绘图过程包装成函数

# 将上述过程包装成函数:
def plot_svc_decision_function(model: SVC, ax=None):
"""画出线性数据中策边界和平行于决策边界的超平面 Args:
model (SVC): 模型
ax (_type_, optional): 子图. Defaults to None.
"""
if ax is None:
ax = plt.gca() # 获取子图或新建子图
xlim = ax.get_xlim() # 获取子图x轴最大值和最小值
ylim = ax.get_ylim() # 获取子图y轴最大值和最小值 # 在最大值和最小值之间形成30个规律的数据
x = np.linspace(xlim[0], xlim[1], 30)
y = np.linspace(ylim[0], ylim[1], 30) # 将x,y转换成x^2, y^2的二维数组
Y, X = np.meshgrid(y, x)
# 组成 xy * 2 的数组
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], s=50, cmap="rainbow", c=y)
plot_svc_decision_function(clf)



# 测试
x1, y1 = make_blobs(n_samples=500, centers=2, cluster_std=0.9)
clf1 = SVC(kernel="linear").fit(x1, y1)
plt.scatter(x1[:, 0], x1[:, 1], c=y1, s=25, cmap="rainbow")
plot_svc_decision_function(clf1)



探索模型

# 根据决策边界,对X中的样本进行分类,返回的结构为n_samples
clf.predict(x)
array([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, 1, 0, 1, 0, 1, 0, 1, 1,
0, 1, 1, 0, 1, 0])
# 返回给定测试数据和标签的平均准确度
clf.score(x, y)
1.0
# 返回支持向量
clf.support_vectors_
array([[0.5323772 , 3.31338909],
[2.11114739, 3.57660449],
[2.06051753, 1.79059891]])
# 返回每个类中支持向量的个数
clf.n_support_
array([2, 1], dtype=int32)

推广到非线性情况

from sklearn.datasets import make_circles

x, y = make_circles(n_samples=300, factor=0.1, noise=0.1)
# x.shape(300, 2)
# y.shape(300,) plt.scatter(x[:, 0], x[:, 1], c=y, s=50, cmap="rainbow")
plt.show()



# 测试plot_svc_decision_function
clf = SVC(kernel="linear").fit(x, y)
plt.scatter(x[:, 0], x[:, 1], s=50, cmap="rainbow", c=y)
plot_svc_decision_function(clf)
clf.score(x, y)
0.6733333333333333



为非线性数据增加维度并绘制 3D 图像

r = np.exp(-(x**2).sum(1))  # r.shape(300,)
rlim = np.linspace(min(r), max(r), 100)
from mpl_toolkits import mplot3d

# 定义一个绘制三维图像的函数
# elev表示上下旋转的角度
# azim表示平行旋转的角度
def plot_3D(elev=30, azim=30, x=x, y=y):
ax = plt.subplot(projection="3d")
ax.scatter3D(x[:, 0], x[:, 1], r, c=y, s=50, cmap="rainbow")
ax.view_init(elev=elev, azim=azim)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("r")
plt.show() plot_3D()



将上述过程放到 Jupyter Notebook 中运行

# 如果放到jupyter notebook中运行
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_circles X, y = make_circles(100, factor=0.1, noise=0.1)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap="rainbow") 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")
plot_svc_decision_function(clf)
r = np.exp(-(X**2).sum(1))
rlim = np.linspace(min(r), max(r), 100)
from mpl_toolkits import mplot3d def plot_3D(elev=30, azim=30, X=X, y=y):
ax = plt.subplot(projection="3d")
ax.scatter3D(X[:, 0], X[:, 1], r, c=y, s=50, cmap="rainbow")
ax.view_init(elev=elev, azim=azim)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("r")
plt.show() from ipywidgets import interact, fixed interact(plot_3D, elev=[0, 30], azip=(-180, 180), X=fixed(X), y=fixed(y))
plt.show()



interactive(children=(Dropdown(description='elev', index=1, options=(0, 30), value=30), IntSlider(value=30, de…

线性SVM决策过程的可视化的更多相关文章

  1. 线性SVM

    (本文内容和图片来自林轩田老师<机器学习技法>) 1. 线性SVM的推导 1.1 形象理解为什么要使用间隔最大化 容忍更多的测量误差,更加的robust.间隔越大,噪声容忍度越大: 1.2 ...

  2. SVM1 线性SVM

    一.Linear Support Vector Machine 接下来的讨论假设数据都是线性可分的. 1.1 SVM的引入:增大对测量误差的容忍度 假设有训练数据和分类曲线如下图所示: 很明显,三个分 ...

  3. cs231n --- 1:线性svm与softmax

    cs231n:线性svm与softmax 参数信息: 权重 W:(D,C) 训练集 X:(N,D),标签 y:(N,1) 偏置量bias b:(C,1) N:训练样本数:  D:样本Xi 的特征维度, ...

  4. 支持向量机(Support Vector Machine,SVM)—— 线性SVM

      支持向量机(Support Vector Machine,简称 SVM)于 1995 年正式发表,由于其在文本分类任务中的卓越性能,很快就成为机器学习的主流技术.尽管现在 Deep Learnin ...

  5. 线性SVM的推导

    线性SVM算法的一般过程 线性SVM的推导 超平面方程 SVM是用来分类的.给定一系列输入数据(n维向量),需要找到一个切分界线(n-1维的超平面),这里假定数据是线性可分的.比如,二维数据的超平面是 ...

  6. 机器学习读书笔记(七)支持向量机之线性SVM

    一.SVM SVM的英文全称是Support Vector Machines,我们叫它支持向量机.支持向量机是我们用于分类的一种算法. 1 示例: 先用一个例子,来了解一下SVM 桌子上放了两种颜色的 ...

  7. 《机器学习技法》---线性SVM

    (本文内容和图片来自林轩田老师<机器学习技法>) 1. 线性SVM的推导 1.1 形象理解为什么要使用间隔最大化 容忍更多的测量误差,更加的robust.间隔越大,噪声容忍度越大: 1.2 ...

  8. 线性SVM分类器实战

    1 概述 基础的理论知识参考线性SVM与Softmax分类器. 代码实现环境:python3 2 数据处理 2.1 加载数据集 将原始数据集放入"data/cifar10/"文件夹 ...

  9. SVM-支持向量机(一)线性SVM分类

    SVM-支持向量机 SVM(Support Vector Machine)-支持向量机,是一个功能非常强大的机器学习模型,可以处理线性与非线性的分类.回归,甚至是异常检测.它也是机器学习中非常热门的算 ...

  10. 《Machine Learning in Action》—— 剖析支持向量机,单手狂撕线性SVM

    <Machine Learning in Action>-- 剖析支持向量机,单手狂撕线性SVM 前面在写NumPy文章的结尾处也有提到,本来是打算按照<机器学习实战 / Machi ...

随机推荐

  1. 基于python+django的求职招聘网站-网上招聘管理系统设计与实现

    该系统是基于python+django的求职招聘网站.网上招聘管理系统.网上人才招聘系统.毕业生求职招聘系统.大学生求职招聘系统.校园招聘系统.企业招聘系统.系统适合场景:大学生.课程作业.毕业设计. ...

  2. 【Hash】字符串哈希

    Hash 的核心思想在于,将输入映射到一个值域较小.可以方便比较的范围,典型的用法就是将资源紧张的设备中的不定长字符串转化为定长整数,以达到节省空间的目的 如:printf("This is ...

  3. Kafka 社区KIP-382中文译文(MirrorMaker2/集群复制/高可用/灾难恢复)

    译者:对于Kafka高可用的课题,我想每个公司都有自己的方案及思考,这是一个仁者见仁智者见智的命题,而社区给出了一个较大的特性,即MirrorMaker 2.0,不论是准备做高可用还是单纯的数据备份, ...

  4. IBM jca 工具的学习与整理

    IBM jca 工具的学习与整理 背景 发现自己最早看到IBM这个工具的时间是 2022年9月份. 但是一直没有进行过仔细的学习与论证. 本周出现了一个问题. 虽然通过gclog明显看出来是一个oom ...

  5. ext4 扩容磁盘的方式方法

    ext4 扩容磁盘的方式方法 背景 前期一直处理xfs,lvm磁盘的扩容 很少处理ext4的磁盘扩容 今天发现自己竟然对这一块有盲区. 晚上回家自己学习研究了会儿, 发现知识点还挺多 所以总结一下. ...

  6. [转帖]nginx 反向代理中proxy_set_header的含义

    https://www.jianshu.com/p/cd813d68ed25 0.1212020.10.23 09:29:53字数 284阅读 9,939 1.proxy_set_header设置的请 ...

  7. Springboot tomcat.threads线程数学习

    Springboot tomcat.threads线程数学习 摘要 压测完nginx 突然想搞一下springboot内嵌的tomcat的 threads的参数 一不做二不休, 直接就着脚本进行学习和 ...

  8. [转帖]基于腾讯云微服务引擎(TSE) ,轻松实现云上全链路灰度发布

    https://my.oschina.net/u/4587289/blog/8570699 1.  概述 软件开发过程中,应用发布非常频繁,通常情况下,开发或运维人员会将系统里所有服务同时上线,使得所 ...

  9. 微软Windows Sever系统也将强制要求TPM及CPU兼容

    https://www.cnbeta.com/articles/tech/1238647.htm 去年微软推出Win11系统时,TPM安全模块以及Intel 8代酷睿/AMD锐龙2代及以上的硬件要求引 ...

  10. 插件时间格式处理moment如何使用

    第1步下载插件 cnpm i moment -S 第2步 在main.js中去使用 在main.js中 注册全局过滤器 fmtdata是等会你用的 可以自定义 fmtdata直接可以调用.是一个过滤器 ...