[机器学习与scikit-learn-40]:算法-分类-支持向量机-通过3D图像可视化线性不可分数据升维后的线性可分的效果图。
Posted 文火冰糖的硅基工坊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[机器学习与scikit-learn-40]:算法-分类-支持向量机-通过3D图像可视化线性不可分数据升维后的线性可分的效果图。相关的知识,希望对你有一定的参考价值。
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/123838687
目录
前言:
低维空间棘手难缠的麻烦事,
升到高维空间后就不算个事。
核函数就是外挂的升维神器
金字塔的底层,只能获得最低纬度的信息,拥有最低纬度视野和认知,挣夺极度有限的资源。
金字塔的顶层,能够获得最多纬度的信息,拥有更高纬度视野和认知,分配大量的富裕资源。
本文就是通过代码展示二维不可分转变成三维可分的效果。
第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
以上是关于[机器学习与scikit-learn-40]:算法-分类-支持向量机-通过3D图像可视化线性不可分数据升维后的线性可分的效果图。的主要内容,如果未能解决你的问题,请参考以下文章
机器学习机器学习入门02 - 数据拆分与测试&算法评价与调整