可视化线性SVM

前言

前面几篇博客对SVM的原理以及决策边界和损失函数是怎么来的做了详细的说明,下面希望用代码来可视化这个过程。

标题

  1. 数据集

这里通过make_blobs这个聚类数据生成器来生成数据。

关于make_blobs参数
n_samples:生成的样本的总数
n_features:每个样本的特征数
centers:类别数(簇个数)
cluster_std:每个簇的方差

# 50个样本,每个样本特征数为2,2个类别
X, y = make_blobs(n_samples=50, n_features=2, centers=2, random_state=0, cluster_std=0.6)
  1. 绘制样本点

将二维特征,一个特征作为横坐标,一个作为纵坐标,类别用不同颜色来区分

plt.scatter(X[:, 0], X[:, 1], c=y, s=80, cmap='coolwarm')
plt.show()

效果图:

在这里插入图片描述

  1. 完整代码
from sklearn.datasets import make_blobs
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

# 制作数据集
# 50个样本,每个样本特征数为2
X, y = make_blobs(n_samples=50, n_features=2, centers=2, random_state=0, cluster_std=0.6)
# 绘制样本点
plt.scatter(X[:, 0], X[:, 1], c=y, s=80, cmap='coolwarm')

ax = plt.gca()  # 获取当前子图
xlim = ax.get_xlim()
ylim = ax.get_ylim()
axisx = np.linspace(xlim[0], xlim[1], 30)
axisy = np.linspace(ylim[0], ylim[1], 30)
axisy, axisx = np.meshgrid(axisy, axisx)
xy = np.vstack([axisx.ravel(), axisy.ravel()]).T
# print(xy.shape)
# plt.scatter(xy[:, 0], xy[:, 1], s=1, cmap='coolwarm')

# 建模
clf = SVC(kernel="linear").fit(X, y)
Z = clf.decision_function(xy).reshape(axisx.shape)
# 绘制决策边界和平行于它的两个超平面
# 虚线 实线(决策边界) 虚线
ax.contour(axisx, axisy,
           Z, colors="k",
           levels=[-1, 0, 1], alpha=0.5,
           linestyles=["--", "-", "--"])
ax.set_xlim(xlim)
ax.set_ylim(ylim)
plt.show()

效果图:

在这里插入图片描述
meshgrid和vstack
关于上述代码中的meshgrid和vstack,以一个小例子来说明其作用:

import numpy as np
"""meshgrid和vstack"""
"""
meshgrid把两个特征向量其中一个作横坐标,
另一个作纵坐标,组合成坐标点,这些坐标点可以用来画图
"""
m = np.array([1, 2, 3])
n = np.array([7, 9])
# m和n组合,有6个坐标
# (1, 7)(1, 9)(2, 7)(2, 9)(3, 7)(3, 9)
x, y = np.meshgrid(m, n)
print("x = ", x)
print("y = ", y)
print(x.ravel())  # 降维
print(y.ravel())
xy = np.vstack([x.ravel(), y.ravel()]).T
print(xy)

输出结果:

x =  [[1 2 3]
 [1 2 3]]
y =  [[7 7 7]
 [9 9 9]]
[1 2 3 1 2 3]
[7 7 7 9 9 9]
[[1 7]
 [2 7]
 [3 7]
 [1 9]
 [2 9]
 [3 9]]

meshgrid就是把两个特征向量其中一个作横坐标,另一个作纵坐标,组合成坐标点,用这些坐标点来画图。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值