线性 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. C#设计模式16——中介者模式的写法

    是什么: 中介者模式是一种行为型设计模式,它定义了一个中介者对象来封装一系列对象之间的交互.中介者模式可以使得对象间的交互更加松耦合,避免了对象之间的直接依赖,从而使系统更加灵活.易于扩展和维护. 为 ...

  2. 基于html+javascript开发的base64解码工具

    base64在线解码工具可以帮助你将Base64编码的字符串解码为原始的文本或数据. 预览入口 以下是一个简单的base64在线解码工具的示例: html <!DOCTYPE html> ...

  3. 基于Html+腾讯云播SDK开发的m3u8播放器

    周末业余时间在家无事,学习了一下腾讯的云播放sdk,并制作了一个小demo(m3u8播放器),该在线工具是基于腾讯的云播sdk开发的,云播sdk非常牛,可以支持多种播放格式. 预览地址 m3u8pla ...

  4. Maven项目手动配置依赖项

    1.问题 很多时候,我们依靠其本身的识别功能,并不能很好的识别依赖项(尤其是指定版本),且对于一些位于 <\build>不能自动去下载,这时候我们就要去手动配置依赖项 2.解决 2.1 首 ...

  5. 神经网络优化篇:详解局部最优的问题(The problem of local optima)

    局部最优的问题 在深度学习研究早期,人们总是担心优化算法会困在极差的局部最优,不过随着深度学习理论不断发展,对局部最优的理解也发生了改变.向展示一下现在怎么看待局部最优以及深度学习中的优化问题. 这是 ...

  6. 浏览器兼容 : IE 5 到 IE 9

    <!--[if IE]> <link href="ie.css" rel="stylesheet"> <![endif]--> ...

  7. 数据-CRUD

    CRUD Create 创建 Read 读取 Update 更新 Delete 删除 场景 只要存在数据结构概念,就必存在CRUD

  8. [转帖]浪潮PM8222-SHBA、RAID 2GB PM8204、RAID 4GB PM8204,阵列卡配置方法

    1.8222和8204对比 这几个型号的阵列卡都很相似,配置方法也基本一样 8204就是在8222上的基础上增加了缓存,可以通过下图对比 正面8204比8222多一个掉电保护接口 8204背面多了几个 ...

  9. [转帖]为什么需要在脚本文件的开头加上#!/ bin / bash?

    本文翻译自:Why do you need to put #!/bin/bash at the beginning of a script file? I have made Bash scripts ...

  10. [转帖]MegaRaidCli64 常用命令解释

    MegaRaidCli64 常用命令解释 安装 查看 创建 删除 案例 安装 Centos wget https://docs.broadcom.com/docs-and-downloads/raid ...