线性SVM决策过程的可视化
线性 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决策过程的可视化的更多相关文章
- 线性SVM
(本文内容和图片来自林轩田老师<机器学习技法>) 1. 线性SVM的推导 1.1 形象理解为什么要使用间隔最大化 容忍更多的测量误差,更加的robust.间隔越大,噪声容忍度越大: 1.2 ...
- SVM1 线性SVM
一.Linear Support Vector Machine 接下来的讨论假设数据都是线性可分的. 1.1 SVM的引入:增大对测量误差的容忍度 假设有训练数据和分类曲线如下图所示: 很明显,三个分 ...
- cs231n --- 1:线性svm与softmax
cs231n:线性svm与softmax 参数信息: 权重 W:(D,C) 训练集 X:(N,D),标签 y:(N,1) 偏置量bias b:(C,1) N:训练样本数: D:样本Xi 的特征维度, ...
- 支持向量机(Support Vector Machine,SVM)—— 线性SVM
支持向量机(Support Vector Machine,简称 SVM)于 1995 年正式发表,由于其在文本分类任务中的卓越性能,很快就成为机器学习的主流技术.尽管现在 Deep Learnin ...
- 线性SVM的推导
线性SVM算法的一般过程 线性SVM的推导 超平面方程 SVM是用来分类的.给定一系列输入数据(n维向量),需要找到一个切分界线(n-1维的超平面),这里假定数据是线性可分的.比如,二维数据的超平面是 ...
- 机器学习读书笔记(七)支持向量机之线性SVM
一.SVM SVM的英文全称是Support Vector Machines,我们叫它支持向量机.支持向量机是我们用于分类的一种算法. 1 示例: 先用一个例子,来了解一下SVM 桌子上放了两种颜色的 ...
- 《机器学习技法》---线性SVM
(本文内容和图片来自林轩田老师<机器学习技法>) 1. 线性SVM的推导 1.1 形象理解为什么要使用间隔最大化 容忍更多的测量误差,更加的robust.间隔越大,噪声容忍度越大: 1.2 ...
- 线性SVM分类器实战
1 概述 基础的理论知识参考线性SVM与Softmax分类器. 代码实现环境:python3 2 数据处理 2.1 加载数据集 将原始数据集放入"data/cifar10/"文件夹 ...
- SVM-支持向量机(一)线性SVM分类
SVM-支持向量机 SVM(Support Vector Machine)-支持向量机,是一个功能非常强大的机器学习模型,可以处理线性与非线性的分类.回归,甚至是异常检测.它也是机器学习中非常热门的算 ...
- 《Machine Learning in Action》—— 剖析支持向量机,单手狂撕线性SVM
<Machine Learning in Action>-- 剖析支持向量机,单手狂撕线性SVM 前面在写NumPy文章的结尾处也有提到,本来是打算按照<机器学习实战 / Machi ...
随机推荐
- 类的MRO属性 C3算法
C3算法 class A(object): pass class B(A): pass class C(A): pass class D(B): pass class E(C): pass class ...
- 第1篇 numpy 语法
import numpy as np A = np.array([ [1, 2, 3, 4], [5, 6, 7, 8], ], dtype=int) # dtype指定数据类型int float p ...
- go 接口学习笔记
这里是对接口在汇编层面上转换和实现的小结,详细了解可参考 Go 语言接口的原理 1. 类型转换:结构体到接口 1.1 结构体方法实现接口 package main type Duck interfac ...
- 【RTOS】基于RTOS的降低功耗的策略
RTOS中降低功耗的策略 Saving Power with an RTOS 介绍 随着绿色节能产品需求的增加,快速增长的移动设备,其电池寿命最受关注,设计者必须要考虑在其设计中如何最大限度的降低功耗 ...
- mongo环境搭建
安装 mongoDB mongo下载 添加 MONGOROOT/bin 到环境变量 PATH MONGOROOT是mongo安装目录 启动 mongo 服务启动程序 MONGOROOT/bin/mon ...
- Java开发者的Python快速进修指南:探索15种独特的Python特殊方法
概述 在Python中,特殊方法(也称为魔术方法)是由Python解释器自动调用的,我们不需要手动调用它们,而是使用内置函数来间接地使用它们.举个例子,我们可以实现特殊方法__len__(),然后通过 ...
- 使用阿里canal实现mysql与Elasticsearch增量同步
一.背景介绍 最近在做一个地理信息相关的项目,需要维护大量的地址描述数据,同时需要提供对数据检索的功能,准备采用Elasticsearch(6.7)实现.那么问题就来了,地址数据需要同时在MySQL和 ...
- [转帖]/etc/security/limits.conf 详解与配置
https://www.cnblogs.com/operationhome/p/11966041.html 一. /etc/security/limits.conf 详解 /etc/security/ ...
- [转帖]TiDB 内存控制文档
https://docs.pingcap.com/zh/tidb/stable/configure-memory-usage 目前 TiDB 已经能够做到追踪单条 SQL 查询过程中的内存使用情况,当 ...
- [转帖]CentOS7上systemctl的使用
https://www.cnblogs.com/yeyuzhuanjia/p/14676182.html CentOS 7.x开始,CentOS开始使用systemd服务来代替daemon,原来管理系 ...