[机器学习与scikit-learn-38]:算法-分类-支持向量机-通过等高线可视化决策边界线和隔离带
Posted 文火冰糖的硅基工坊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[机器学习与scikit-learn-38]:算法-分类-支持向量机-通过等高线可视化决策边界线和隔离带相关的知识,希望对你有一定的参考价值。
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/123837009
目录
前言:
本文重点不在支持向量机,而在于解读,如何通过等高线,可视化展现决策边界线和隔离带。
第1步骤:导入库
# 导读库
from sklearn import datasets
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np
第2步骤:创建线性可数据集
2.1 创建数据集
# 创建数据集
# 生成线性不可分样本点
X, y = datasets.make_blobs(n_samples=50, centers=2, random_state=0,cluster_std=0.6)
print(X.shape)
print(y.shape)
(50, 2) (50,)
2.2 可视化数据集
#首先要有散点图
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
ax = plt.gca() #获取当前的子图,如果不存在,则创建新的子图
第3步骤:创建线性支持向量机
3.1 建模模型,并进行训练
#建模,通过fit计算出对应的决策边界
clf = SVC(kernel = "linear").fit(X,y)#计算出对应的决策边界
3.2 获得支持向量
#根据决策边界,对X中的样本进行分类,返回的结构为n_samples
y_pred = clf.predict(X)
print(y_pred)
#返回给定测试数据和标签的平均准确度
score=clf.score(X,y)
print("score:", score)
#返回支持向量坐标(这是支持向量机的名称的来源)
support_vector = clf.support_vectors_
print("支持向量:\\n", support_vector)
#返回每个类中支持向量的个数
vector_matrix = clf.n_support_ #array([2, 1])
print("支持向量分布", vector_matrix)
[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] score: 1.0 支持向量: [[0.44359863 3.11530945] [2.33812285 3.43116792] [2.06156753 1.96918596]] 支持向量分布 [2 1]
3.3 可视化支持向量
# 可视化支持向量
# 绘制所有样本点
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
print(support_vector[::,0])
print(support_vector[::,1])
#绘制特定点
plt.scatter(support_vector[::,0],support_vector[::,1],c="black",s=50,cmap="rainbow")
[0.44359863 2.33812285 2.06156753] [3.11530945 3.43116792 1.96918596]
3.4 生成每个输入的样本点到决策边界的距离
#重要接口decision_function,返回每个输入的样本点到决策边界的距离!!!!
#这个距离作为等高线的高度!!!!
#然后再将这个距离转换为axisx的结构,这是由于画图的函数contour要求Z的结构必须与X和Y保持一致
Z = clf.decision_function(xy).reshape(axisx.shape)
print(Z.shape)
print(Z)
(40, 30) [[ 3.59599448 3.30273116 3.00946785 ... -4.32211513 -4.61537845 -4.90864177] [ 3.62022649 3.32696317 3.03369985 ... -4.29788313 -4.59114645 -4.88440977] [ 3.64445849 3.35119517 3.05793185 ... -4.27365112 -4.56691444 -4.86017776] ... [ 4.49257864 4.19931532 3.90605201 ... -3.42553097 -3.71879429 -4.01205761] [ 4.51681065 4.22354733 3.93028401 ... -3.40129897 -3.69456229 -3.98782561] [ 4.54104265 4.24777933 3.95451601 ... -3.37706696 -3.67033028 -3.9635936 ]]
z是所有样本点到决策边界的距离,作为等高线的“高”
第4步骤:通过等高线可视化决策边界与隔离带
4.1 什么是网格
位置决策边界,必须先理解网格
#获取平面上两条坐标轴的最大值和最小值
xlim = ax.get_xlim()
ylim = ax.get_ylim()
print(xlim)
print(ylim)
#在最大值和最小值之间形成30个规律的数据
# X轴上40个点坐标
# Y轴上30个点坐标
axisx = np.linspace(xlim[0],xlim[1],40)
axisy = np.linspace(ylim[0],ylim[1],30)
print("axisx line", axisx.shape)
print("axisy line",axisy.shape)
# 创建网格
# grid后,扩展成平面后,同一个行的40个点,具有不同的x值,具有相同的y值
# grid后,扩展成平面后,同一个行的30个点,具有相同的x值,具有不同的y值
#我们将使用这里形成的二维数组作为我们contour函数中的X和Y
#使用meshgrid函数将两个一维向量转换为特征矩阵
#核心是将两个特征向量广播,以便获取y.shape * x.shape这么多个坐标点的横坐标和纵坐标
axisy,axisx = np.meshgrid(axisy,axisx)
print("axisx mesh:", axisx.shape)
print("axisy mesh:", axisy.shape)
#ravel()是降维函数,把二维数据将为一维数据
axisx_r=axisx.ravel()
axisy_r=axisy.ravel()
print("axisx ravel:", axisx_r.shape)
print("axisy ravel:", axisy_r.shape)
#vstack能够将多个结构一致的一维数组按行堆叠起来
xy = np.vstack([axisx_r, axisy_r]).T
#xy就是已经形成的网格,它是遍布在整个画布上的密集的点
print("stack:",xy.shape)
#第1列xy[:,0]作为x值
#第2列xy[:,1]作为y值
plt.scatter(xy[:,0],xy[:,1],s=1,cmap="rainbow")
4.2 堆叠
#理解函数meshgrid和vstack的作用
a = np.array([1,2,3])
b = np.array([7,8])
#两两组合,会得到多少个坐标?
#答案是6个,分别是 (1,7),(2,7),(3,7),(1,8),(2,8),(3,8)
v1,v2 = np.meshgrid(a,b)
print("v1:\\n",v1)
print("v2:\\n",v2)
v = np.vstack([v1.ravel(), v2.ravel()]).T
print("v:\\n",v)
v1: [[1 2 3] [1 2 3]] v2: [[7 7 7] [8 8 8]] v: [[1 7] [2 7] [3 7] [1 8] [2 8] [3 8]]
4.3 绘制原始样本和决策边界
#首先要有散点图
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
# 绘制支持向量点
plt.scatter(support_vector[::,0],support_vector[::,1],c="black",s=50,cmap="rainbow")
#获取当前的子图,如果不存在,则创建新的子图
ax = plt.gca()
#画决策边界和平行于决策边界的超平面
# X, Y决定了平面上的坐标点;
# Z 为(X,Y)值对应的高度,不同的高度,特定形状或颜色的线条表示
# 定义三个等高线:到决策边界距离分布为1,0,-1
ax.contour(axisx,axisy, Z
,colors="k"
,levels=[-1,0,1] # 关键地方:三条等高线的对应的Z值:分别是Z值为-1的(X,Y)点,Z值为0和Z为1的(X,Y)点。
,alpha= 1.0 # 透明度,决定等高线的颜色深度
,linestyles=["--","-","--"]) # 定义三条等高线的形状,
ax.set_xlim(xlim) #设置x轴取值
ax.set_ylim(ylim)
4.4 绘制任意等高线
# 绘制任意等高线
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
ax = plt.gca()
#通过level指定某一特定的距离(即高度),也即空间点到决策边界的距离
ax.contour(axisx,axisy,Z
,colors="k"
,levels=[-3.33917354]
,alpha=0.5
,linestyles=["--"])
4.5 函数化可视化功能,方便后期的调用
#将上述过程包装成函数:
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")
# 绘制支持向量点
plt.scatter(support_vector[::,0],support_vector[::,1],c="black",s=50,cmap="rainbow")
# 通过自定义函数绘制决策边界以及安全隔离线。
plot_svc_decision_function(clf)
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/123837009
以上是关于[机器学习与scikit-learn-38]:算法-分类-支持向量机-通过等高线可视化决策边界线和隔离带的主要内容,如果未能解决你的问题,请参考以下文章
机器学习机器学习入门02 - 数据拆分与测试&算法评价与调整