[机器学习与scikit-learn-38]:算法-分类-支持向量机-通过等高线可视化决策边界线和隔离带

Posted 文火冰糖的硅基工坊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[机器学习与scikit-learn-38]:算法-分类-支持向量机-通过等高线可视化决策边界线和隔离带相关的知识,希望对你有一定的参考价值。

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/123837009


目录

前言:

第1步骤:导入库

第2步骤:创建线性可数据集

2.1 创建数据集

2.2 可视化数据集

第3步骤:创建线性支持向量机

3.1 建模模型,并进行训练

3.2 获得支持向量

3.3 可视化支持向量

3.4 生成每个输入的样本点到决策边界的距离

第4步骤:通过等高线可视化决策边界与隔离带

4.1 什么是网格

4.2 堆叠

4.3 绘制原始样本和决策边界

4.4 绘制任意等高线

4.5 函数化可视化功能,方便后期的调用


前言:

本文重点不在支持向量机,而在于解读,如何通过等高线,可视化展现决策边界线和隔离带。

第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 - 数据拆分与测试&算法评价与调整

Python3入门机器学习 经典算法与应用

《分布式机器学习:算法理论与实践》——RE

Python3入门机器学习--经典算法与应用|Python3机器学习

从入门到精通:机器学习算法与应用