SVM算法的理解及其Python实现多分类和二分类

本文深入探讨了支持向量机(SVM)的基本原理,包括最大边距超平面的概念,以及如何通过核方法处理非线性分类问题。此外,还介绍了SVM在多分类问题中的应用策略,如一对多和一对一法,并提供了使用Python和Scikit-Learn库进行SVM二分类和多分类的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理

SVM被提出于1964年,在二十世纪90年代后得到快速发展并衍生出一系列改进和扩展算法,在人像识别、文本分类等模式识别(pattern recognition)问题中有得到应用。

支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning) 方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane)

SVM可以通过核方法(kernel method)进行非线性分类,是常见的核学习(kernel learning)方法之一。


分类理论

在分类问题中给定输入数据和学习目标:X = { X1, X2,…Xn },Y = { y1,y2,…yn}。其中输入数据的每个样本都包含多个特征并由此构成特征空间(feature space):Xi = { x1,x2…xn} ,而学习目标为二元变量 y { − 1 , 1 } y\{-1,1\} y{1,1}表示负类(negative class)和正类(positive class)

在这里插入图片描述
若输入数据所在的特征空间存在作为决策边界(decision boundary)的超平面将学习目标按正类和负类分开,并使任意样本的点到平面距离大于等于1,则称该分类问题具有线性可分性,参数 w,b分别为超平面的法向量和截距。
在这里插入图片描述
满足该条件的决策边界实际上构造了2个平行的超平面作为间隔边界以判别样本的分类:
在这里插入图片描述
所有在上间隔边界上方的样本属于正类,在下间隔边界下方的样本属于负类。两个间隔边界的距离 d = 2 ∥ w ∥ d=\frac{2}{\|w\|} d=w2被定义为边距(margin),位于间隔边界上的正类和负类样本为支持向量(support vector)。


确定最大间距

我们确定一个分类器,对任意的实数,当 w T x + b > 1 , y i = 1 ; w T x + b < − 1 , y i = − 1 w^{T}x+b>1,y_{i}=1;w^{T}x +b<−1,y_{i}=−1 wTx+b>1yi=1wTx+b<1yi=1。有了分类器,那么我们的目标就是找到最小间隔的数据点,然后将其最大化并求出参数w,b。
这就可以写作: a r g m a x w , b m i n n ( l a b e l ⋅ ( w T + b ) ) ⋅ 1 ∣ ∣ w ∣ ∣ argmax_{w,b}\quad {min_{n}\quad (label⋅(w^{T}+b))⋅\frac{1}{||w||}} argmaxw,bminn(label(wT+b))w1
很显然 l a b e l ⋅ ( w T x i + b ) ⩾ 1 , i = 1 , 2 , . . . , m , label⋅(w^{T}x_{i}+b)⩾1,i=1,2,...,m, label(wTxi+b)1,i=1,2,...,m为了最大化间隔只需要最大化 ∣ ∣ w ∣ ∣ − 1 ||w||^{-1} w1。等价于最小化 ∣ ∣ w ∣ ∣ 2 ||w||^{2} w2
因此支持向量机的形式可表示如下:
1、 m i n w , b 1 2 ∣ ∣ w ∣ ∣ 2 min_{w,b} \quad \frac{1}{2}||w||^{2} minw,b21w2
2、 s . t . y i ( w T x i + b ) ⩾ 1 , i = 1 , 2 , . . . , m . s.t.y_{i}(w^{T}x_{i}+b)⩾1,i=1,2,...,m. s.t.yi(wTxi+b)1,i=1,2,...,m.
最后问题变成了凸二次规划的问题,可解。


SVM多分类

SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器。目前,构造SVM多类分类器的方法主要有两类:一类是直接法,直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题“一次性”实现多类分类。这种方法看似简单,但其计算复杂度比较高,实现起来比较困难,只适合用于小型问题中;另一类是间接法,主要是通过组合多个二分类器来实现多分类器的构造,常见的方法有one-against-one和one-against-all两种。

a.一对多法(one-versus-rest,简称1-v-r-SVMs)。训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。

b.一对一法(one-versus-one,简称1-v-1 SVMs)。其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。Libsvm中的多类分类就是根据这个方法实现的。


Python实现

多分类

  	X_train, X_test, y_train, y_test = train_test_split(feature, label, test_size=.2,random_state=0)
    # 训练模型
    model = OneVsRestClassifier(svm.SVC(kernel='linear',probability=True,random_state=random_state))
    print("[INFO] Successfully initialize a new model !")
    print("[INFO] Training the model…… ")
    clt = model.fit(X_train,y_train)
    print("[INFO] Model training completed !")
    # 保存训练好的模型,下次使用时直接加载就可以了
    joblib.dump(clt,"F:/python/model/conv_19_80%.pkl")
    print("[INFO] Model has been saved !")
  
    y_test_pred = clt.predict(X_test)
    ov_acc = metrics.accuracy_score(y_test_pred,y_test)
    print("overall accuracy: %f"%(ov_acc))
    print("===========================================")
    acc_for_each_class = metrics.precision_score(y_test,y_test_pred,average=None)
    print("acc_for_each_class:\n",acc_for_each_class)
    print("===========================================")
    avg_acc = np.mean(acc_for_each_class)
    print("average accuracy:%f"%(avg_acc))

二分类

>>> import numpy as np
>>> X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
>>> y = np.array([1, 1, 2, 2])
>>> from sklearn.svm import SVC
>>> clf = SVC()
>>> clf.fit(X, y) 
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
    max_iter=-1, probability=False, random_state=None, shrinking=True,
    tol=0.001, verbose=False)
>>> print(clf.predict([[-0.8, -1]]))
[1]
### 关于面包板电源模块 MB102 的 USB 供电规格及兼容性 #### 1. **MB102 基本功能** 面包板电源模块 MB102 是一种常见的实验工具,主要用于为基于面包板的小型电子项目提供稳定的电压输出。它通常具有两路独立的稳压输出:一路为 5V 另一路可调电压(一般范围为 3V 至 12V)。这种设计使得它可以满足多种芯片传感器的不同工作电压需求。 #### 2. **USB 供电方式** MB102 支持通过 USB 接口供电,输入电压通常是标准的 5V DC[^1]。由于其内部集成了 LM7805 稳压器以及可调节电位器控制的直流-直流变换电路,因此即使输入来自电脑或其他低功率 USB 设备,也能稳定地向负载供应电力。不过需要注意的是,如果项目的功耗较高,则可能超出某些 USB 端口的最大电流能力(一般是 500mA),从而引起不稳定现象或者保护机制启动断开连接的情况发生。 #### 3. **兼容性分析** 该型号广泛适用于各种微控制器单元 (MCU),特别是那些像 Wemos D1 R32 这样可以通过杜邦线轻松接入并共享相同逻辑级别的系统[^2]。另外,在提到 Arduino Uno 板时也表明了良好的互操作性,因为两者均采用相似的标准接口定义与电气特性参数设置[^4]: - 对于需要 3.3V 工作环境下的组件来说,只需调整好对应跳线帽位置即可实现精准匹配; - 当涉及到更多外围扩展应用场合下,例如带有多重模拟信号采集任务的情形里,利用 MB102 提供干净无干扰的基础能源供给就显得尤为重要了[^3]。 综上所述,对于打算构建以单片机为核心的原型验证平台而言,选用具备良好声誉记录且易于获取配件支持服务链路上下游资源丰富的品牌产品——如这里讨论过的这款特定类型的配电装置不失为明智之举之一。 ```python # 示例 Python 代码展示如何检测硬件状态 import machine pin = machine.Pin(2, machine.Pin.IN) if pin.value() == 1: print("Power supply is stable.") else: print("Check your connections and power source.") ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jeremy_lf

你的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值