SVM原理及代码实现(学习笔记)

article/2025/10/1 1:10:26

1.概念

支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面.它分类的思想是,给定给一个包含正例和反例的样本集合,svm的目的是寻找一个超平面来对样本根据正例和反例进行分割,从而达到分类的目的。

2.SVM-线性分类器

 对于二维空间来说,我理解的是能够在给定两组不同的数据中用一条直线把这两组数据给分离开来,如下图示。

 

 超平面

对于多维来说,如果能够存在一个线性函数能够将样本完全正确的分离开来,那么这些数据就是线性可分的,反之,称为非线性可分的。什么叫线性函数呢?通俗地讲,就是在一维空间里就是一个点,在二维空间里就是一条直线,三维空间里就是一个平面,以此类推。
如果不关注空间的维数,这种线性函数其实就是超平面

下面讲述一个例子(转自视频:https://www.bilibili.com/video/BV1D64y1f7r6?p=1):

 在样本空间中,我们可以用线性方程来说明:

 对于二维空间来说,线性方程可表示为:w1x1+w2x2+b=0。其中,w=(w1;w2;w3;……w d)为法向量,决定超平面的方向;b为位移项,决定了超平面与原点之间的距离,显然,划分超平面可被法向量w和位移b确定,下面我们将其记为(w,b)。样本空间中任意点x到超平面(w,b)的距离可写为

                        

 

在分类问题中给定输入数据和学习目标:

 ,其中输入数据的每个样本都包含多个特征并由此构成特征空间(feature space):

,而学习目标为二元变量表示负类(negative class)和正类(positive class)。

若输入数据所在的特征空间存在作为决策边界(decision boundary)的超平面将学习目标按正类和负类分开,并使任意样本的点到平面距离大于等于1 [2] 

则称该分类问题具有线性可分性,参数w,b分别为超平面的法向量和截距。

满足该条件的决策边界实际上构造了2个平行的超平面作为间隔边界以判别样本的分类:

 

所有在上间隔边界上方的样本属于正类,在下间隔边界下方的样本属于负类。两个间隔边界的距离

被定义为边距(margin),位于间隔边界上的正类和负类样本为支持向量(support vector)。

 

 拉格朗日乘子法求得KNN条件:

SM算法

非线性分类:把数据放到高维度上再次进行分割

 

 

 

 当f(x)=x时,这组数据是个直线,如上半部分,但是当我把这组数据变为f(x)=x^2时,这组数据就变成了下半部分的样子,也就可以被红线所分割

 核函数:

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

             常见核函数:

                h度多项式核函数

                高斯径向基和函数:图像分类

                S型核函数

 

 在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别、分类(异常值检测)以及回归分析。

   其具有以下特征:

   (1)SVM可以表示为凸优化问题,因此可以利用已知的有效算法发现目标函数的全局最小值。而其他分类方法都采用一种基于贪心学习的策略来搜索假设空间,这种方法一般只能获得局部最优解。

  (2) SVM通过最大化决策边界的边缘来实现控制模型的能力。尽管如此,用户必须提供其他参数,如使用核函数类型和引入松弛变量等。

  (3)SVM一般只能用在二类问题,对于多类问题效果不好。

from sklearn import svm
import numpy as np
import matplotlib.pyplot as plt#准备训练样本
x=[[1,8],[3,20],[1,15],[3,35],[5,35],[4,40],[7,80],[6,49]]
y=[1,1,-1,-1,1,-1,-1,1]##开始训练
clf=svm.SVC()  ##默认参数:kernel='rbf'
clf.fit(x,y)#print("预测...")
#res=clf.predict([[2,2]])  ##两个方括号表面传入的参数是矩阵而不是list##根据训练出的模型绘制样本点
for i in x:res=clf.predict(np.array(i).reshape(1, -1))if res > 0:plt.scatter(i[0],i[1],c='r',marker='*')else :plt.scatter(i[0],i[1],c='g',marker='*')##生成随机实验数据(15行2列)
rdm_arr=np.random.randint(1, 15, size=(15,2))
##回执实验数据点
for i in rdm_arr:res=clf.predict(np.array(i).reshape(1, -1))if res > 0:plt.scatter(i[0],i[1],c='r',marker='.')else :plt.scatter(i[0],i[1],c='g',marker='.')
##显示绘图结果
plt.show()

 运行结果:

 

 

松弛变量:

数据本身可能有噪点,会使得原本线性可分的数据需要映射到高维度去。对于这种偏离正常位置很远的数据点,我们称之为 outlier ,在我们原来的 SVM 模型里,outlier 的存在有可能造成很大的影响,因为超平面本身就是只有少数几个 support vector 组成的,如果这些 support vector 里又存在 outlier 的话,其影响就很大了。

因此排除outlier点,可以相应的提高模型准确率和避免Overfitting的方式。

解决多分类问题:

经典的SVM只给出了二类分类的算法,现实中数据可能需要解决多类的分类问题。因此可以多次运行SVM,产生多个超平面,如需要分类1-10种产品,首先找到1和2-10的超平面,再寻找2和1,3-10的超平面,以此类推,最后需要测试数据时,按照相应的距离或者分布判定。

SVM与其他机器学习算法对比(图):

代码如下:

from sklearn import svm
import numpy as np
import matplotlib.pyplot as plt##设置子图数量
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(7, 7))
ax0, ax1, ax2, ax3 = axes.flatten()# 准备训练样本
x = [[1, 8], [3, 20], [1, 15], [3, 35], [5, 35], [4, 40], [7, 80], [6, 49]]
y = [1, 1, -1, -1, 1, -1, -1, 1]
'''说明1:核函数(这里简单介绍了sklearn中svm的四个核函数,还有precomputed及自定义的)LinearSVC:主要用于线性可分的情形。参数少,速度快,对于一般数据,分类效果已经很理想RBF:主要用于线性不可分的情形。参数多,分类结果非常依赖于参数polynomial:多项式函数,degree 表示多项式的程度-----支持非线性分类Sigmoid:在生物学中常见的S型的函数,也称为S型生长曲线说明2:根据设置的参数不同,得出的分类结果及显示结果也会不同'''
##设置子图的标题
titles = ['LinearSVC (linear kernel)','SVC with polynomial (degree 3) kernel','SVC with RBF kernel',  ##这个是默认的'SVC with Sigmoid kernel']
##生成随机试验数据(15行2列)
rdm_arr = np.random.randint(1, 15, size=(15, 2))def drawPoint(ax, clf, tn):##绘制样本点for i in x:ax.set_title(titles[tn])res = clf.predict(np.array(i).reshape(1, -1))if res > 0:ax.scatter(i[0], i[1], c='r', marker='*')else:ax.scatter(i[0], i[1], c='g', marker='*')##绘制实验点for i in rdm_arr:res = clf.predict(np.array(i).reshape(1, -1))if res > 0:ax.scatter(i[0], i[1], c='r', marker='.')else:ax.scatter(i[0], i[1], c='g', marker='.')if __name__ == "__main__":##选择核函数for n in range(0, 4):if n == 0:clf = svm.SVC(kernel='linear').fit(x, y)drawPoint(ax0, clf, 0)elif n == 1:clf = svm.SVC(kernel='poly', degree=3).fit(x, y)drawPoint(ax1, clf, 1)elif n == 2:clf = svm.SVC(kernel='rbf').fit(x, y)drawPoint(ax2, clf, 2)else:clf = svm.SVC(kernel='sigmoid').fit(x, y)drawPoint(ax3, clf, 3)plt.show()

运行结果:

 

 


http://chatgpt.dhexx.cn/article/o9yEZOIJ.shtml

相关文章

SVM原理详解

SVM 原理详解 转自&#xff1a;http://www.blogjava.net/zhenandaci/category/31868.html &#xff08;一&#xff09;SVM的简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的&#xff0c;它在解决小样本、非线性及高维模式识别中表现出许多特有的…

SVM算法原理解读

-----------------------------------------------------需要死记硬背的部分--------------------------------------------- 超平面划分正负数据 支持向量上对应的公式&#xff1a; 转换为&#xff1a; 转换为&#xff1a; 正样例yi1&#xff0c;此时 负样例yi-1&#xff…

最容易理解的SVM算法原理

基于最大间隔分隔数据 1.1支持向量与超平面 SVM(Support Vector Mac)又称为支持向量机&#xff0c;是一种二分类的模型。当然如果进行修改之后也是可以用于多类别问题的分类。支持向量机可以分为线性核和非线性两大类。其主要思想为找到空间中的一个更够将所有数据样本划开的…

SVM介绍

SVM 概念 支持向量机&#xff08;support vector machines&#xff0c;SVM&#xff09;是一种二分类模型。基本原理是求解能够正确划分训练数据集并且几何间隔最大的分离超平面。 作用 svm不仅可以支持这种简单的线性可分离的数据&#xff0c;还可以 借助“软间隔(soft margi…

SVM理论

SVM入门&#xff08;一&#xff09;至&#xff08;三&#xff09;Refresh 按:之前的文章重新汇编一下,修改了一些错误和不当的说法&#xff0c;一起复习,然后继续SVM之旅. &#xff08;一&#xff09;SVM的简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年…

SVM的理解

1.SVM的概念 SVM&#xff0c;英文全称为 Support Vector Machine&#xff0c;中文名为支持向量机&#xff0c;由数学家Vapnik等人早在1963年提出。在深度学习兴起之前&#xff0c;SVM一度风光无限&#xff0c;是机器学习近几十年来最为经典的&#xff0c;也是最受欢迎的分类方法…

SVM算法原理

简介 支持向量机&#xff08;support vector machines&#xff09;是一个二分类的分类模型&#xff08;或者叫做分类器&#xff09;。如图&#xff1a; 它分类的思想是&#xff0c;给定给一个包含正例和反例的样本集合&#xff0c;svm的目的是寻找一个超平面来对样本根据正例和…

svm原理详解,看完就懂(一)

&#xff08;一&#xff09;SVM的八股简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的&#xff0c;它在解决小样本、非线性及高维模式识别中表现出许多特有的优势&#xff0c;并能够推广应用到函数拟合等其他机器学习问题中[10]。 支持向量机方法…

SVM算法—原理讲解

原文作者&#xff1a;奔跑的前浪 原文地址&#xff1a;svm算法 最通俗易懂讲解 最近在学习svm算法&#xff0c;借此文章记录自己的学习过程&#xff0c;在学习时很多处借鉴了z老师的讲义和李航的统计&#xff0c;若有不足的地方&#xff0c;请海涵&#xff1b;svm算法通俗的理解…

SVM --从“原理”到实现

零. 本文所有代码均能在我 github上的 DML 找到&#xff0c;顺便求点Star 一.引入 从一开始接触机器学习&#xff0c;就感觉SVM&#xff08;支持向量机 Support Vector Machine&#xff09;就是高端大气上档次的代名词啊&#xff0c;在深度学习出来之前一直都力压ANN一头&…

SVM算法详解

Support Vector Machine 终于&#xff0c;我们来到了SVM。SVM是我个人感觉机器学习中最优美的算法&#xff0c;这次我们要来非常细致地介绍。SVM是一类有监督的分类算法&#xff0c;它的大致思想是&#xff1a;假设样本空间上有两类点&#xff0c;我们希望找到一个划分超平面&…

SVM简介

SVM 文章目录 SVM一. 什么是SVM1. 简介2.SVM分类 二. 详细介绍1. 线性可分SVM1.1 支撑点&#xff0c;支撑向量1.2 分割超平面与间隔最大化1.3 线性可分SVM的目标函数以及相关算法1.4 线性可分SVM的简单举例 2.线性SVM2.1 为什么需要线性SVM2.2 线性SVM相关理论2.3 线性SVM算法 …

Svm算法原理及实现

Svm&#xff08;support Vector Mac&#xff09;又称为支持向量机&#xff0c;是一种二分类的模型。当然如果进行修改之后也是可以用于多类别问题的分类。支持向量机可以分为线性核非线性两大类。其主要思想为找到空间中的一个更够将所有数据样本划开的超平面&#xff0c;并且使…

SVM 原理详解,通俗易懂

看了该作者的文章&#xff0c;瞬间膜拜了&#xff01;讲得太好了&#xff01; 转自&#xff1a;http://www.blogjava.net/zhenandaci/category/31868.html &#xff08;一&#xff09;SVM的简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的&…

机器学习笔记6:SVM基本原理

SVM的基本原理&#xff1a; 1、最大间隔原则 2、对偶表示 3、KKT条件 SVM(Support Vector Machine)&#xff0c;又称支持向量机&#xff0c;在分类问题上&#xff0c;除了logistic分类回归外&#xff0c;还有另一种实现方式&#xff0c;那就是使用SVM原则。那么什么是SVM 呢。…

SVM原理

我们先认识一下SVM&#xff1a; &#xff08;1&#xff09;支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种对数据进行二分类的广义线性分类器&#xff0c;其分类边界是对学习样本求解的最大间隔超平面。 &#xff08;2&#xff09;SVM使用铰链损失函数…

通俗易懂SVM原理介绍,适合小白食用

目录 1、SVM概念描述 2、SVM数学表达及相关计算 3、SVM优化问题定义 附&#xff1a;证明区 【证明1】 【计算1】 1、SVM概念描述 如图一所示&#xff0c;存在两个数据集&#xff0c;我们希望通过一个超平面将两个数据集分割开&#xff0c;并且我们希望这个超平面离两个数…

01-Hive创建表

声明&#xff1a;本实验环境是Apache hadoop-2.2.0&#xff0c;zookeeper-3.4.5&#xff0c;mysql Server version: 5.1.73作为元数据库&#xff0c;hive版本是apache-hive-0.9.0-bin&#xff0c;都是apache&#xff0c;不是CDH和其他。本实验集群3台&#xff0c;一个主节点(ha…

hive 中创建表的三种方式

官网地址&#xff1a;https://cwiki.apache.org/confluence/display/Hive/LanguageManualDDL 通常我们所使用的创建hive表有三种方式 1.create table 首先我们找到官网对创建表的描述如下&#xff1a; ’[]’ 表示可选&#xff0c;’|’ 表示几选一 CREATE [TEMPORARY] [EXT…

hive创建新表——基础

创建基础表 1、创建表&#xff1a; create table if not exists orders 创建一个名叫“orders”的表&#xff0c;“if not exists”可以写可不写&#xff0c;如果相同名字的表已经存在&#xff0c;则抛出异常&#xff0c;可以用 IF NOT EXIST 选项来忽略这个异常。 2、定义表…