机器学习测试笔记(13)——支持向量机(上)

简介: 机器学习测试笔记(13)——支持向量机(上)

1. 线性可分与线性不可分


image.png

                   

上图左边为线性可分的,通过一条直线就可以把两类分开;而右边是线性不可分的,如何用一条线都不能把红黑两个分离开。对于线性不可分的我们可以采取升维的方式来解决,比如有如下十个样本。

image.png


红色的是一类,绿色的是另一类,它在二维平面上是线性不可分的;我们现在加上一维,如果它是红色的,第三维设为1,否则设为0。这样我们通过升维把线性不可分的变为线性可分的,如下图所示。

image.png



从正方向看下来,三维还原成二维,就变为:

image.png



2 支持向量机原理


支持向量机(Support Vector Machine,以下简称SVM),作为传统机器学习的一个非常重要的分类算法,它是一种通用的前馈网络类型,最早是由Vladimir N.Vapnik Alexey Ya.Chervonenkis1963年提出,目前的版本(softmargin)是CorinnaCortes Vapnik1993年提出,1995年发表。深度学习(2012)出现之前,如果不考虑集成学习的算法,不考虑特定的训练数据集,在分类算法中的表现SVM说是排第一估计是没有什么异议的。


SVM本来是一种线性分类和非线性分类都支持的二元分类算法,但经过演变,现在也支持多分类问题,也能应用到了回归问题。


一些线性不可分的问题可能是非线性可分的,即特征空间存在超曲面(hypersurface)将正类和负类分开。使用非线性函数可以将非线性可分问题从原始的特征空间映射至更高维的希尔伯特空间(Hilbert space),从而转化为线性可分问题。


支持向量机通过某非线性变换 φ( x) ,将输入空间映射到高维特征空间。特征空间的维数可能非常高。如果支持向量机的求解只用到内积运算,而在低维输入空间又存在某个函数 K(x, x') ,它恰好等于在高维空间中这个内积,即K( x, x') =<φ( x) ⋅φ( x') > 。那么支持向量机就不用计算复杂的非线性变换,而由这个函数 K(x, x')直接得到非线性变换的内积,使大大简化了计算。这样的函数 K(x, x') 称为核函数。


核函数一般包括以下几个:

image.png


我们下面来看代码


# 导入NumPy库
import numpy as np
# 导入画图工具
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs
def SVM_linear():
#创建50个数据点,分成2类
        X , y =  make_blobs(n_samples=50,random_state=6,centers=2)
#创建一个线性内核的支持向量
        clf =  svm.SVC(kernel='linear',C=1000)# C-SVC的惩罚参数C,默认值是1.0
        clf.fit(X,y)
# 画出数据点
         plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.Paired,s=30)
# 建立图像坐标
        ax = plt.gca() #当前的图表和子图可以使用plt.gcf()和plt.gca()获得
xlim = ax.get_xlim() #返回当前Axes视图的x的上下限
        ylim = ax.get_ylim()  #返回当前Axes视图的y的上下限
# 生成等差数列
        xx =  np.linspace(xlim[0],xlim[1],30)
        yy =  np.linspace(ylim[0],ylim[1],30)
        YY , XX =  np.meshgrid(yy,xx) # meshgrid函数用两个坐标轴上的点在平面上画网格。
        xy =  np.vstack([XX.ravel(),YY.ravel()]).T# np.hstack():横向拼接,增加特征量;np.vstack():纵向拼接,增加样本个数
        Z =  clf.decision_function(xy). reshape(XX.shape)
#decision_function:计算样本点到分割超平面的函数距离
#shape是查看数据有多少行多少列
#reshape()是数组array中的方法,作用是将数据重新组织
# 把分类决定边界画出来
         ax.contour(XX,YY,Z,colors='k',levels=[-1,0,1],alpha=0.5,linestyles=['--','-','--'])  
#绘制等高线
         ax.scatter(clf.support_vectors_[:,0],clf.support_vectors_[:,1],s=100,linewidth=1,facecolors='none')
        plt.show()

image.png


以上展示的是SVC线性核的模型。中间这条“线”叫做最大边界超平面(Maximum Margin Separating Hyperplane)(二维时为线,三维时为面,多维时为超平面)。这条线到和所有支持向量的距离都是最大的。离这个超平面最近的点就是“支持向量”,点到超平面的距离叫做间隔,支持向量机的意思就是使超平面和支持向量之间的间隔尽可能的大。


f(x) = wTx+b

w = (w1,w2,w3,…,wn)为法向量

f(x) = 0:超平面上

> 0 :超平面一边的一个点

< 0 :超平面另一边的一个点

注:

  • SVM=Support Vector Machine 是支持向量机;
  • SVC=Support VectorClassification就是支持向量机用于分类
  • SVR=Support Vector Regression.就是支持向量机用于回归分析。

SVM适合于有监督学习的分类与回归算法,如下图。

image.png



wTxi+b>=1=>yi=1

wTxi+b<=-1=>yi=-1

下面我们通过代码来看一下:SVC with Linear KernelSVC with RBF KernelSVC with sigmoid KernelSVC with poly Kernel的曲线。


import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs
def SVM_base(mykernel,title):
#创建50个数据点,分成2类
       X , y =  make_blobs(n_samples=50,random_state=6,centers=2)
#创建一个线性内核的支持向量
if mykernel ==  'LinearSVC':
              clf =  svm.LinearSVC()
else:
              clf =  svm.SVC(kernel=mykernel,C=1000)# C-SVC的惩罚参数C,默认值是1.0
       clf.fit(X,y)
# 画出数据点
       plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.Paired,s=30)
# 建立图像坐标
       ax = plt.gca() #当前的图表和子图可以使用plt.gcf()和plt.gca()获得
       xlim = ax.get_xlim() #返回当前Axes视图的x的上下限
       ylim = ax.get_ylim() #返回当前Axes视图的y的上下限
# 生成等差数列
       xx =  np.linspace(xlim[0],xlim[1],30)
       yy =  np.linspace(ylim[0],ylim[1],30)
       YY , XX =  np.meshgrid(yy,xx) # meshgrid函数用两个坐标轴上的点在平面上画网格。
       xy = np.vstack([XX.ravel(),YY.ravel()]).T#  np.hstack():横向拼接,增加特征量;np.vstack():纵向拼接,增加样本个数
       Z =  clf.decision_function(xy). reshape(XX.shape)
#decision_function:计算样本点到分割超平面的函数距离
#shape是查看数据有多少行多少列
#reshape()是数组array中的方法,作用是将数据重新组织
# 把分类决定边界画出来
       ax.set_title(title)
       ax.contour(XX,YY,Z,colors='k',levels=[-1,0,1],alpha=0.5,linestyles=['--','-','--'])#绘制等高线
if mykernel !=  'LinearSVC':
              ax.scatter(clf.support_vectors_[:,0],clf.support_vectors_[:,1],s=100,linewidth=1,facecolors='none')
def SVM_for_all_model():
       models =  ['linear','rbf','sigmoid','poly','LinearSVC']
       titles = ['SVC with  Linear Kernel','SVC with RBF Kernel','SVC with sigmoid Kernel','SVC with poly  Kernel','LinearSVC']
       figure, axs =  plt.subplots(2,3,figsize =(10,3))
       figure.suptitle('All  Model of SVM')
       i = 0
for model in models:
              plt.subplot(2,3,i+1)
              SVM_base(model,titles[i])
              i = i+1
       plt.show()

image.png


我们再通过程序绘制Linear KernelRBF Kernelpoly Kernel LinearSVC的对红酒数据画出边界曲线。


from sklearn import datasets
#定义一个函数来画图
def make_meshgrid(x, y, h=.02):
        x_min,x_max =  x.min()-1,x.max()+1
        y_min,y_max =  y.min()-1,y.max()+1
        xx, yy =  np.meshgrid(np.arange(x_min, x_max, h),np.arange(y_min, y_max, h))
return xx,yy
#定义一个绘制等高线的函数
def plot_contour(ax, clf, xx,yy,**params) :
        Z =  clf.predict(np.c_[xx.ravel(),yy.ravel()])
        Z =  Z.reshape(xx.shape)
        out =  ax.contourf(xx,yy,Z,**params)
return out
#不同核函数的SVM对比
def compare_with_different_SVM():
       wine =  datasets.load_wine()
#选取数据集前两个特征
       X = wine.data[:,:2]
       y = wine.target
       C = 2.5 #SVM参数正则化
       models =  (svm.SVC(kernel='linear',C=C),
                svm.LinearSVC(C=C),
                svm.SVC(kernel='rbf',gamma=0.7,C=C),
                svm.SVC(kernel='sigmoid',C=C),
                svm.SVC(kernel='poly',degree=3,C=C))
       models = (clf.fit(X,y)  for clf in models)
#设定图标
       titles = ('SVC with  Linear Kernel',
'LinearSVC(Linear Kernel)',
'SVC with RBF Kernel',
'SVC with sigmoid Kernel',
'SVC with polynomial(degree 3) Kernel'#设置子图形的个数和排列方式
fig, sub = plt.subplots(2,3,figsize =(10,3))
plt.subplots_adjust(wspace=0.4,hspace=0.4)
#使用前面定义的函数画图
X0, X1 = X[:,0],X[:,1]
        xx, yy =  make_meshgrid(X0, X1)
for clf, title, ax in zip(models, titles,sub.flatten()):
                 plot_contour(ax,clf,xx,yy,cmap=plt.cm.plasma,alpha=0.8)
                 ax.scatter(X0,X1,c=y,cmap=plt.cm.plasma,s=20,edgecolors='k')
                 ax.set_xlim(xx.min(),xx.max())
                 ax.set_ylim(yy.min(),yy.max())
                 ax.set_xlabel('Feature 0')
                 ax.set_ylabel('Feature 1')
                 ax.set_xticks(())
                 ax.set_yticks(())
                 ax.set_title(title)
        plt.show()


image.png


由此可以看出:

  • Linear KernelLinearSVC差不多,边界都是线性的;
  • RBFsigmoidpolynomial Kernel 边界都不是线性的。
目录
相关文章
|
7月前
|
存储 数据可视化 测试技术
一个测试工程师的实战笔记:我是如何在Postman和Apipost之间做出选择的?
优秀的API测试工具应该具备: 分层设计:既有可视化操作,也开放代码层深度定制 场景感知:自动识别加密需求推荐处理方案 协议包容:不强迫开发者为了不同协议切换工具 数据主权:允许自主选择数据存储位置
184 7
|
10月前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
313 6
|
10月前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段。本文介绍了 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,强调了样本量、随机性和时间因素的重要性,并展示了 Python 在 A/B 测试中的具体应用实例。
231 1
|
10月前
|
机器学习/深度学习 数据采集 算法
机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用
医疗诊断是医学的核心,其准确性和效率至关重要。本文探讨了机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用。文章还讨论了Python在构建机器学习模型中的作用,面临的挑战及应对策略,并展望了未来的发展趋势。
635 1
|
11月前
|
机器学习/深度学习 弹性计算 自然语言处理
前端大模型应用笔记(二):最新llama3.2小参数版本1B的古董机测试 - 支持128K上下文,表现优异,和移动端更配
llama3.1支持128K上下文,6万字+输入,适用于多种场景。模型能力超出预期,但处理中文时需加中英翻译。测试显示,其英文支持较好,中文则需改进。llama3.2 1B参数量小,适合移动端和资源受限环境,可在阿里云2vCPU和4G ECS上运行。
500 1
|
11月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
234 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
11月前
|
机器学习/深度学习 并行计算 数据可视化
目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)
这篇文章介绍了如何使用PaddleClas框架完成多标签分类任务,包括数据准备、环境搭建、模型训练、预测、评估等完整流程。
762 0
目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)
|
10月前
|
机器学习/深度学习 数据采集 人工智能
自动化测试的未来:AI与机器学习的融合之路
【10月更文挑战第41天】随着技术的快速发展,软件测试领域正经历一场由人工智能和机器学习驱动的革命。本文将探讨这一趋势如何改变测试流程、提高测试效率以及未来可能带来的挑战和机遇。我们将通过具体案例分析,揭示AI和ML在自动化测试中的应用现状及其潜力。
193 0
|
4月前
|
机器学习/深度学习 数据采集 人工智能
20分钟掌握机器学习算法指南
在短短20分钟内,从零开始理解主流机器学习算法的工作原理,掌握算法选择策略,并建立对神经网络的直观认识。本文用通俗易懂的语言和生动的比喻,帮助你告别算法选择的困惑,轻松踏入AI的大门。
|
10月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
954 6