线性SVM决策过程的可视化

线性SVM决策过程的可视化
我们可以使用sklearn中的式子来为可视化我们的决策边界,和决策边界平行的两个超平面。
在这里插入图片描述
线性可分完整代码:
在这里插入图片描述

#导入需要的模块和数据
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.svm import SVC
import matplotlib.pyplot as plt


X,y=make_blobs(n_samples=50,centers=2,cluster_std=0.6,random_state=0)

def plot_svc_decision_function(model,ax=None):
    # 获取当前的子图,如果不存在,则创建新的子图
    # 默认创建(0.0, 1.0)范围内的横纵坐标
    if ax==None:
        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)
    # 将两个一维数组变成二维数组
    axisx, axisy = np.meshgrid(axisx, axisy)
    # 将特征向量转换为特征矩阵的函数
    # 核心是将两个特征向量广播,以便获取x.shape*y.shape这么多点的横坐标和纵坐标
    xy = np.vstack([axisx.ravel(), axisy.ravel()]).T

    # 获取x.shape*y.shape这么多个坐标点
    # ravel()降维函数,把每一行都放在第一行,vstack能够将多个结构一致的一维数组按行堆叠起来
    # xy就是形成的网络,遍及在画布上密集的点

    # 建模通过fit计算对应决策边界
    # 输入每个样本到决策样本边界的距离
    P = model.decision_function(xy).reshape(axisx.shape)
    # 画决策边界到平行决策边界的超平面
    ax.contour(
        axisx, axisy, P,
        c='k',
        levels=[-1, 0, 1],
        alpha=0.5,
        linestyle=['--', '-', '--']
    )
    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)
plt.xticks([])
plt.yticks([])
plt.show()

线性SVM决策过程的可视化

在这里插入图片描述
线性SVM决策过程的可视化完整代码:

#导入需要的模块和数据
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_circles

from sklearn.datasets import make_circles
X,y = make_circles(100, factor=0.2, noise=.1)

r = np.exp(-(X**2).sum(1))
rlim = np.linspace(min(r),max(r),0.2)
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()
#
# plot_3D()
# from ipywidgets import interact,fixed
# interact(plot_3D,elev=[0,30],azip=(-180,180),X=fixed(X),y=fixed(y))

此时我们的数据在三维空间中,我们的超平面就是一个二维平面。明显我们可以用一个平面将两类数据隔开,这个 平面就是我们的超平面。我们刚才做的,计算r,并将r作为数据的第三维度来讲数据升维的过程,被称为“核变 换”,即是将数据投影到高维空间中,以寻找能够将数据完美分割的超平面,而在高维空间中计算来找出超平面的 函数就叫做核函数。在SVM中,这个功能由参数“kernel”控制。之前我们一直使用这个参数,但是没有给大家解 释,我们使用的是“linear",线性核函数,只能用于线性的情况。刚才我们使用的计算r的方法,其实是高斯径向基 核函数,在参数”kernel“中输入”rbf“就可以使用。我们来看看模型找出的决策边界时什么样:
在这里插入图片描述

#导入需要的模块和数据
import numpy as np
from sklearn.svm import SVC
import matplotlib.pyplot as plt
from sklearn.datasets import make_circles


from sklearn.datasets import make_circles
X,y = make_circles(100, factor=0.2, noise=.1)

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 = "rbf").fit(X,y)
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
plot_svc_decision_function(clf)
plt.show()
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可视化SVM决策边界,你可以使用Python中的一些数据可视化库,例如Matplotlib和Scikit-learn。下面是一个基本的示例代码,演示了如何绘制SVM决策边界: ```python import numpy as np import matplotlib.pyplot as plt from sklearn import svm # 创建一些样本数据 X = np.array([[2, 2], [1, 3], [2, 3], [3, 1], [3, 2]]) y = np.array([0, 0, 0, 1, 1]) # 创建一个SVM分类器,并训练模型 clf = svm.SVC(kernel='linear') clf.fit(X, y) # 绘制样本点 plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired) # 绘制决策边界 ax = plt.gca() xlim = ax.get_xlim() ylim = ax.get_ylim() # 创建网格以绘制决策边界 xx = np.linspace(xlim[0], xlim[1], 30) yy = np.linspace(ylim[0], ylim[1], 30) YY, XX = np.meshgrid(yy, xx) xy = np.vstack([XX.ravel(), YY.ravel()]).T Z = clf.decision_function(xy).reshape(XX.shape) # 绘制决策边界和边界间隔 ax.contour(XX, YY, Z, levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'], colors='red') # 绘制支持向量 ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100, linewidth=1, facecolors='none', edgecolors='black') plt.show() ``` 这段代码首先创建了一些样本数据,然后使用SVC类创建了一个线性核的SVM分类器。接下来,我们用样本点绘制散点图,并使用决策函数绘制决策边界和边界间隔。最后,绘制支持向量。 运行这段代码,你将得到一个显示决策边界和支持向量的散点图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值