SVM 2d/3d多分类案例与可视化

  • SVM2D可视化

  • SVM多分类

  • SVM3D可视化

在前面的几篇小结中,我们对SVM的软硬间隔以及灵魂-核方法基本原理和数学证明进行了推导与解释说明。可以从下列链接中完整了解下SVM的工作机制。
SVM与软硬间隔
拉格朗日乘子法/Slater/KKT条件
SVM之核技巧

下面通过使用sklearn中的接口与现有数据进行SVM的使用以及可视化的展示

SVM2D可视化
# 分別引入点簇型,环型,月牙型,二分类型,高斯型数据
from sklearn.datasets import make_blobs,make_circles,make_moons,make_classification,make_gaussian_quantiles
from sklearn.svm import SVC
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import numpy as np

samples = 100
# 生成数据
datasets = [make_blobs(n_samples=samples,centers=2,cluster_std=0.8,random_state=100),
           make_circles(n_samples=samples,noise=0.1,factor=0.6,random_state=200),
           make_moons(n_samples=samples,noise=0.1,random_state=300),
           make_classification(n_samples=samples,n_features=2,n_informative=2,n_redundant=0,random_state=400),
           make_gaussian_quantiles(n_samples=samples,n_classes=2,random_state=500)]

fig,ax = plt.subplots(nrows=1,ncols=5,figsize=(20,4))
# 绘制下原始数据图
for i,(X,y) in enumerate(datasets):
    ax[i].scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.Accent,s=40)
plt.show()
# 如下图所示

在这里插入图片描述

kernel = ['linear','rbf','poly','sigmoid']
data_name = ['bolbs','circles','moons','classification','gauss']
fig,ax = plt.subplots(nrows=5,ncols=5,figsize=(20,20))
for i,(X,y) in enumerate(datasets):
    if i==0:
        ax[i,0].set_title("raw data",fontsize=20)
    ax[i,0].scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.Accent,s=40)
    ax[i,0].set_xticks(())
    ax[i,0].set_yticks(())
    ax[i,0].set_ylabel(data_name[i],fontsize=20)
    for j,core in enumerate(kernel,1):
        if i==0:
            ax[0,j].set_title(core,fontsize=20)
        # 创建网格,并计算距离
        xx,yy = ((min(X[:,0]-1),max(X[:,0]+1)),(min(X[:,1]-1),max(X[:,1]+1)))
        xx = np.arange(xx[0],xx[1],step=0.1)
        yy = np.arange(yy[0],yy[1],step=0.1)
        XX,YY = np.meshgrid(xx,yy)
        grid = np.c_[XX.ravel(),YY.ravel()]
        
        model = SVC(kernel=core,degree=3,C=1.0)
        model.fit(X,y)
        score = model.score(X,y)
        distance = model.decision_function(grid).reshape(XX.shape)
#         print(distance.shape)
        
        ax[i,j].scatter(X[:,0],X[:,1],c=y,s=40,zorder=10,label="%.2f" % score)
        # 绘制支持向量
        ax[i,j].scatter(model.support_vectors_[:,0],model.support_vectors_[:,1],edgecolor="red",s=70,facecolor="none",zorder=10)
        # 绘制填充轮廓
        ax[i,j].pcolormesh(XX,YY,distance>0,cmap=plt.cm.Accent,shading="auto")
        ax[i,j].contour(XX,YY,distance,levels=[-1,0,1],colors=["pink","blue","pink"],\
                         linestyles=['dashed','solid','dashed'])
        ax[i,j].legend(loc="lower right",edgecolor="red",facecolor="none")
        ax[i,j].set_xticks(())
        ax[i,j].set_yticks(())
fig.tight_layout()
plt.savefig('./svm.png')
plt.show()
# 如下图所示,截图会丢失一部分标记,感兴趣可以自己复制下跑一下,会有完整的图片,右下角为分类正确率

在这里插入图片描述
同前面算法一致,我们这里依旧采取选取鸢尾花案例作为实际分析案例,使用SVM进行多分类

from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.decomposition import PCA
import numpy as np
import pandas as pd

data = load_iris()
panda = pd.DataFrame(data.data,columns=['sepal length ',
 'sepal width ',
 'petal length ',
 'petal width '])
# panda
# panda.describe()
# 我们首先利用pandas软件包分析下数据,看是否存在数据缺失活数据偏移大等问题

# 降维,将四维特征转化为2维点
X = PCA(2).fit_transform(data.data)
y = data.target
plt.scatter(X[:,0],X[:,1],c=y)
这里我们就可以明显的看到降维后是一个线性问题,那么后续采取线性分类器估计会取得较好的结果

在这里插入图片描述

kernel = ['linear','rbf','poly','sigmoid']
fig,ax = plt.subplots(nrows=1,ncols=5,figsize=(20,4))
for i,core in enumerate(kernel,1):

    xx,yy = ((min(X[:,0]-1),max(X[:,0]+1)),(min(X[:,1]-1),max(X[:,1]+1)))
    xx = np.arange(xx[0],xx[1],step=0.1)
    yy = np.arange(yy[0],yy[1],step=0.1)
    XX,YY = np.meshgrid(xx,yy)
    grid = np.c_[XX.ravel(),YY.ravel()]

    # 预测类别
    model = SVC(kernel=core,gamma="scale",decision_function_shape="ovo",degree=3,C=1.0)
#     model = SVC(kernel=core,gamma="scale",decision_function_shape="ovr",degree=3,C=1.0)
    model.fit(X,y)
    score=model.score(X,y)
    prediction = model.predict(grid).reshape(XX.shape)
    if i-1==0:
        ax[0].set_title("raw data",fontsize=20)
        ax[0].scatter(X[:,0],X[:,1],c=y,s=40)
    ax[i].set_title(core,fontsize=20)
    ax[i].scatter(X[:,0],X[:,1],c=y,label="%.2f"% score,s=40,zorder=10)
    ax[i].scatter(model.support_vectors_[:,0],model.support_vectors_[:,1],s=70,edgecolor="red",facecolor="none",zorder=10)
    ax[i].pcolormesh(XX,YY,prediction,cmap=plt.cm.Accent,shading="auto")
    ax[i].contour(XX,YY,prediction,colors=["pink","blue","pink"],linestyles=['dashed','solid','dashed'])
    ax[i].legend(loc=4)

在这里插入图片描述

针对多分类问题进行一个总结,SVM最初最为一个二分类的判别器。后发展到多分类任务中也可以使用。其主要思想有
两种即一对一分类与一对多(一对剩余所有)进行决策分类
n_class:类别数
1:ovo(one versus one)
decision_function_shape="ovo",分类中总共生成了(n_class*(n_class-1))/2个二分类器
2:ovr(one versus rest)
decision_function_shape="ovr",分类中生成了n_class个分类器
decision_function():计算点到分界面的距离
predict():预测每个点所属类别
SVM3D可视化
部分参考网络机器学习视频
from sklearn.datasets import make_circles
# 绘制3维图像需要引入mplot3d模块
from mpl_toolkits import mplot3d
# 动态调整上下、左右翻转角度
from ipywidgets import interact

X,y = make_circles(100,noise=0.1,factor=0.5,random_state=100)
plt.scatter(X[:,0],X[:,1],c=y)
# 下图原始数据图

在这里插入图片描述

def plot_svc(model,canvas=None):
	# 创建画布
    if canvas is None:
        canvas = plt.gca()
    xlim = canvas.get_xlim()
    ylim = canvas.get_ylim()
    # 创建网格
    axisx = np.linspace(xlim[0],xlim[1],num=30)
    axisy = np.linspace(ylim[0],ylim[1],num=30)
    axisx,axisy = np.meshgrid(axisx,axisy)
    grid = np.stack([axisx.ravel(),axisy.ravel()])
    # 获取距离
    distance = model.decision_function(grid.T).reshape(axisx.shape)
    # 绘制支持向量
    canvas.scatter(model.support_vectors_[:,0],model.support_vectors_[:,1],s=70,edgecolor="red",facecolor="none",zorder=10)
    # 绘制分界轮廓
    canvas.contour(axisx,axisy,distance,levels=[-1,0,1],linestyles=['dashed','solid','dashed'],alpha=0.6)

model = SVC(kernel="rbf").fit(X,y)
plt.scatter(X[:,0],X[:,1],c=y)
plot_svc(model)
# 创建z轴刻度
r = np.exp(-(X**2).sum(1))
rlim = np.linspace(min(r),max(r),num=15)
# interact装饰器动态调整上下、左右角度
@interact
def plot_3d(elev=30,azim=30):
    figure = plt.subplot(projection="3d")
    figure.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.BrBG,edgecolors="orange")
    figure.view_init(elev=elev,azim=azim)
    figure.set_xlabel("x")
    figure.set_ylabel("y")
    figure.set_zlabel("z")
plot_3d()

在这里插入图片描述

  • 12
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值