[机器学习与scikit-learn-40]:算法-分类-支持向量机-通过3D图像可视化线性不可分数据升维后的线性可分的效果图。

2023-11-02

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

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


目录

前言:

第1步:线性不可分数据

1.1 构建线性不可分数据集

1.2  构建模型,并进行训练

1.3 可视化决策边界边界

第2步骤: 数据升维

2.1 二次方升维

2.2 升维效果图

2.3 交互式展示升维效果

第3步骤:外挂核函数拟合线性不可分数据

3.1 建立模型并重新拟合

3.2 可视化决策边界


前言:

低维空间棘手难缠的麻烦事,

升到高维空间后就不算个事。

核函数就是外挂的升维神器

金字塔的底层,只能获得最低纬度的信息,拥有最低纬度视野和认知,挣夺极度有限的资源。

金字塔的顶层,能够获得最多纬度的信息,拥有更高纬度视野和认知,分配大量的富裕资源。

本文就是通过代码展示二维不可分转变成三维可分的效果。

第1步:线性不可分数据

1.1 构建线性不可分数据集

# 导入库
from sklearn import datasets
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

from sklearn.datasets import make_circles

# 生成线性不可分样本点
X,y = make_circles(100, factor=0.3, noise=.1)
 
X.shape
 
y.shape
 
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
plt.show()

1.2  构建模型,并进行训练

# 线性不可分展示
# 构建线性模型,并进行学习
clf = SVC(kernel = "linear").fit(X,y)

1.3 可视化决策边界边界

#将上述过程包装成函数:
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)

# 绘制样本图
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")

# 绘制决策边界
plot_svc_decision_function(clf)

# 性能统计
score = clf.score(X,y)
print("score:\n",score)

第2步骤: 数据升维

2.1 二次方升维

# 升维可以把线性不可分转换成线性可分
#定义一个由x计算出来的新维度特征r
print("X.shape:", X.shape)
print("y.shape:", y.shape)
print(X[0])
print(y[0])
# r = e^(-x1^2 + X^2)
# 负号的作用是把直径大的点放在低位,把直径小的点放在高位
# sum的目的是,只增加一个维度。否则很难可视化
# 2次方:完成了直径大的点和直径小的点,在第三个维度上分离的程度,更高次的偶次方,分离程度更大。
r = np.exp(-(X**2).sum(1))
print("r.shape",r.shape)

rlim = np.linspace(min(r),max(r),100)
X.shape: (100, 2)
y.shape: (100,)
[ 0.03095057 -0.46667983]
1
r.shape (100,)

2.2 升维效果图

from mpl_toolkits import mplot3d
 
#定义一个绘制三维图像的函数
#elev表示上下旋转的角度
#azim表示平行旋转的角度
def plot_3D(elev=30,azim=30,X=X,y=y):
    # 构建三维坐标
    ax = plt.subplot(projection="3d")
    
    # 绘制三维原始样本的三点图 X1, X2, Z
    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()

2.3 交互式展示升维效果

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

# 交互式显示三维图像:可以动态修正evel和amin
from ipywidgets import interact,fixed
interact(plot_3D,elev=[0,30,60,90], azip=(-180,180),X=fixed(X),y=fixed(y))

plt.show()

可以通过调整角度观察效果:

elev:俯视角度

azmin:旋转效果

 

 

第3步骤:外挂核函数拟合线性不可分数据

3.1 建立模型并重新拟合

# 外挂核函数,并进行训练
clf = SVC(kernel = "rbf").fit(X,y)

3.2 可视化决策边界

# 可视化原始样本点
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")

# 可视化决策边界和保护带边界
plot_svc_decision_function(clf)


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[机器学习与scikit-learn-40]:算法-分类-支持向量机-通过3D图像可视化线性不可分数据升维后的线性可分的效果图。 的相关文章

随机推荐