机器学习之SVM

一.SVM原理以及概述

1.概述

支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行广义线性分类,其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane)。SVM可以通过核函数进行非线性分类,是常见的核学习(kernel learning)方法之一。

2.原理概述

1、线性可分支持向量机与硬间隔最大化

考虑一个二分类问题。假设输入空间与特征空间为两个不同的空间,这两个空间的元素一一对应,并将输入空间的输入映射为特征空间中的特征向量,支持向量机的学习是在特征空间进行的。

假设一个特征空间上的训练数据集
T =\left \{ (x_1,y_1),(x_2,y_2),...,(x_n,y_n) \right\}

 学习的目标是在特征空间中找到一个分离超平面,能够将实例分到不同的类,分离超平面对应于方程w*x + b = 0,它由法向量 w ww 和截距 b bb 决定。一般地,当训练数据集线性可分时,存在无穷个分离超平面可将数据正确分开,例如感知机利用误分类最小的策略,不过其解有无穷多个,而线性可分支持向量机利用间隔最大化求最优分离超平面,因此其解是唯一的。

2.函数间隔和几何间隔

一般来说,在超平面w \cdot x + b = 0 确定的情况下,\left | w \cdot x + b = 0 \right |能够相对地表示点 x xx 距离超平面的远近,而w \cdot x + b = 0的符号与类标记 γ 的符号是否一致能够表示分类是否正确,所以可用量y * \left (w \cdot x + b \right ) = 0来表示分类的正确性及确信度,这就是函数间隔(functional margin)的概念,记作\hat{\boldsymbol{}\gamma _{i} }

但是只要成比例地改变 w 和 b,例如将它们改为 2w 和 2b,超平面并没有改变,但函数间隔却变为原来的 2 倍,所以需要对 w 加某些约束,如||w|| = 1;使得间隔是确定的。这时函数间隔就成为了几何间隔(geometric margin)

3.间隔最大化

支持向量机学习的基本思想是求解能够正确划分训练数据集并且几何间隔最大的分离超平面。间隔最大化的直观解释是:对训练数据集找到几何间隔最大的超平面意味着以充分大的确信度对训练数据进行分类。也就是说,不仅将正负实例点分开,而且对最难分的实例点(离超平面最近的点)也有足够大的确信度将它们分开。这样的超平面应该对未知的新实例有很好的分类预测能力。

3.1

求最大间隔分离超平面可以表示为下面的约束最优化问题:

又因为函数间隔\hat{\boldsymbol{}\gamma _{i} }的取值并不影响对最优化问题的解,就可以取\hat{\boldsymbol{}\gamma _{i} }\hat{\boldsymbol{}\gamma _{i} }\hat{\boldsymbol{}\gamma _{i} } = 1,从而可得

如果求出了上述优化问题的解w,b,那么就可以得到wx + b = 0,以及f(\mathbf{x}) = \text{sign}(\mathbf{w} \cdot \mathbf{x} + b)线性可分支持向量机模型

综上所述,就是线性可分支持向量机的学习算法——最大间隔法(maximum margin method)。

3.2 学习的对偶算法

为了求解线性可分支持向量机的最优化问题,首先构建拉格朗日函数(Lagrange function),即对每个不等式约束引入拉格朗日乘子α_i ≥ 0,i=1,2,⋯,定义拉格朗日函数:

其中,α=(α1​,α2​,⋯,αN​)T,根据拉格朗日对偶性 ,原始问题可以转变为:

以,为了得到对偶问题的解,需要先求 L(w,b,α) ,对w,b求最小,对α求极大

对w,b偏导后可以解得

因此对α求极大问题可以表示为: 

 

解得α然后就能得到最终的模型f(\mathbf{x}) = (\mathbf{w} \cdot \mathbf{x} + b)

4.非线性支持向量机与核函数

对解线性分类问题,线性分类支持向量机是一种有效的方法,但是有时分类问题是非线性的,原始样本空间也许并不存在一个能正确划分两类样本的超平面。这时可以使用非线性支持向量机

对于这样的问题,可以将样本从原始空间映射到一个根高纬的特征空间,使得样本在这个特征空间内线性可分,如上图中的ϕ (x)

对高纬空间上新生成的特征向量进行内积运算,便得到了核函数,其数学表达式如下

 

当映射到高维空间后,原本待求解的对偶问题转换为了

如果特征空间的维数较高,甚至达到无穷维的话,内积的运算也会非常困难 。因此我们引入核函数的运用,核函数的引入相当于隐式定义了特征映射和特征空间,无需关心这些中间结果的形式就能直接计算待优化的内积核函数的引入相当于隐式定义了特征映射和特征空间,无需关心这些中间结果的形式就能直接计算待优化的内积。

二.算法实现

本文采用随机生成测试点实现线性svm分类,了解和学习svc函数。

一 线性可分

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# 生成虚拟数据集
np.random.seed(0)
X = np.random.randn(300, 2)
y = np.logical_xor(X[:, 0] > 0, X[:, 1] > 0)

# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 对特征进行标准化处理
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 创建SVM分类器
svm_classifier = SVC(kernel='linear')

# 训练SVM模型
svm_classifier.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = svm_classifier.predict(X_test)

# 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: {:.2f}".format(accuracy))

c = 1.0

c= 0.5

 c = 2.0

观测结果

三.实验结果分析

1对于svc关键函数

  1. C:正则化参数。C 的值越大,模型对训练数据的拟合程度越高,但也可能导致过拟合。较小的 C 值会导致模型更多地受到正则化的约束,可能会导致泛化能力更强的模型。默认值为1.0。

  2. kernel:核函数类型。核函数用于将输入数据映射到高维空间,以便在高维空间中找到线性可分的超平面。常用的核函数包括:

    • linear:线性核函数,适用于线性可分的情况。
    • rbf:径向基函数(高斯核函数),适用于非线性可分的情况。需要调整的参数有 gamma
    • poly:多项式核函数,可以使用 degree 参数设置多项式的阶数。

2.对于随机生成的点

由于没有特征值并且类别之间没有明显的分离,即使使用SVM也很难得到很好的预测性能。SVM 是一种基于最大间隔的分类方法,它假设数据是线性可分的。如果数据在特征空间中不是线性可分的,那么即使使用SVM也无法得到很好的分类效果。

  • 27
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值