线性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()