机器学习算法——SVM(Support Vector Machine)分类

目录

对于线性可分样本

对于近似线性可分样本 

对于线性不可分样本

多分类问题


基于课程《地学大数据与人工智能》课的学习笔记。

从sklearn导入数据datasets

同时也需要导入svm里的SVC,用于实现支持向量机(SVM)算法

DecisionBoundaryDisplay,用于样本向量用于分区,注意此处需要更新sklearn版本到最新版本。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.svm import SVC
from sklearn.inspection import DecisionBoundaryDisplay

定义函数,该函数用于绘制超平面和支持面。

#Plot the decision function for a 2D SVC
def plot_SVC_decision_function(model, ax=None, plot_support=True):
    if ax is None:
        ax = plt.gca()
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()
 
    # create grid to evaluate model
    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)
 
    # plot decision boundary and margins
    ax.contour(X, Y, P, colors='k', levels=[-1, 0, 1],
               alpha=0.5, linestyles=['-', '--', '-'], linewidths=1)
 
    # plot support vectors
    if plot_support:
        ax.scatter(model.support_vectors_[:, 0],
                   model.support_vectors_[:, 1],
                   s=300, linewidth=1, facecolors='none')
 
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)

对于线性可分样本

make_blobs用于生成图,n_samples 样本数设置为100,n_features 特征数量设置为2,centers为样本的堆,设置为2,cluster_std为标准差,设置为0.5,用于衡量数据间的离散程度。 random_state=0

# 线性可分样本
# 生成样本数据
X,y=datasets.make_blobs(n_samples=100, n_features=2, centers=2, cluster_std=0.5, random_state=0)
plt.figure()
plt.scatter(X[:,0], X[:,1], c=y, s=20, marker='o', cmap='bwr')
plt.xlabel('$x_1$')
plt.ylabel('$x_2$')
plt.colorbar()

运行该段代码,结果如图:

 

 训练模型

利用SVC函数生成训练模型,kernel为核函数,linear为线性核函数。

# 训练模型
model=SVC(kernel='linear')
model.fit(X,y)

 运行定义的plot_SVC_decision_function函数,绘制支持面和支持面向量以及超平面。

# 绘制支持面与支持向量
plot_SVC_decision_function(model)
plt.scatter(model.support_vectors_[:,0], model.support_vectors_[:,1], marker='o', facecolors='none', edgecolors='k', s=80)

结果如图:

 

 对于近似线性可分样本 

# # 近似线性可分样本
# # 生成样本数据
X,y=datasets.make_blobs(n_samples=100, n_features=2, centers=2, cluster_std=1, random_state=0)
plt.figure()
plt.scatter(X[:,0], X[:,1], c=y, s=20, marker='o', cmap='bwr')
plt.xlabel('$x_1$')
plt.ylabel('$x_2$')
plt.colorbar()

运行结果如图:

可以看出,近似线性可分样本中,有部分向量点交叉,不能线性可分。 

 生成训练模型并绘制支持面和支持向量,其中选用线性核函数,系数C为10。(C的取值可以通过尝试,笔者在此也是试出来的,该值较为良好)

# # 训练模型
model=SVC(kernel='linear', C=10)
model.fit(X,y)

# # 绘制支持面与支持向量
plot_SVC_decision_function(model)
plt.scatter(model.support_vectors_[:,0], model.support_vectors_[:,1], marker='o', facecolors='none', edgecolors='k', s=80)

 运行该段代码,得到以下结果:

 可以看出少数支持向量在支持面之间,即为软间隔SVM模型,运行部分样本犯错。

对于线性不可分样本

# # 线性不可分样本
# # 生成样本数据
X,y=datasets.make_circles(100, factor=0.2, noise=0.1, random_state=0)
plt.figure()
plt.scatter(X[:,0], X[:,1], c=y, s=20, marker='o', cmap='bwr')
plt.xlabel('$x_1$')
plt.ylabel('$x_2$')
plt.colorbar()

运行结果如图:

 可以看出该样本明显是线性不可分,故必须使用核函数。

核函数的作用是使样本的特征向量空间映射到更高维的特征向量空间,从而在“更高维”的空间使该样本能够线性(近似)可分

同上述生成模型:

# # 训练模型
model=SVC(kernel='rbf', C=10)
model.fit(X,y)

# # 绘制支持面与支持向量
plot_SVC_decision_function(model)
plt.scatter(model.support_vectors_[:,0], model.support_vectors_[:,1], marker='o', facecolors='none', edgecolors='k', s=80)

运行得到结果如图: 

 可以看出,通过核函数,样本从线性不可分变到“高维”空间线性可分,采用硬间隔SVM模型。

以上是采用SVM用于二分类问题,同时也可以利用SVM实现多分类问题。

多分类问题

能够实现二分类,多分类就是一级一级二分类实现,较为简单易理解。

利用sklearn中自带的函数能够实现,(以下展示是3分类问题),读者可以自行尝试,只需更改centers的值,此处取3。其余参数值说明见上文~

代码如下: 

# # 多分类样本
# # 生成样本数据
X,y=datasets.make_blobs(n_samples=150, n_features=2, centers=3, cluster_std=0.5, random_state=0)

# # 训练模型
model=SVC(kernel='linear')
model.fit(X,y)

# # 绘制支持面与支持向量
DecisionBoundaryDisplay.from_estimator(model, X)
plt.scatter(X[:,0], X[:,1], c=y, s=20, marker='o', cmap='rainbow')
plt.scatter(model.support_vectors_[:,0], model.support_vectors_[:,1], marker='o', facecolors='none', edgecolors='k', s=80)
plt.xlabel('$x_1$')
plt.ylabel('$x_2$')

运行结果如图:

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值