支持向量机(Support Vector Machines)

支持向量机(Support Vector Machine, SVM)是 Cortes 和 Vapnik 于 1995 年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。

1、SVM思想及步骤

1.1 线性函数

线性函数在一维空间就是一个点,在二维空间里就是一条直线,三维空间里就是一个平面,在多维空间中线性函数有一个统一的名称——超平面(Hyper Plane)。

一般的,如果一个线性函数能够将样本完全正确的分开,就称这些数据是线性可分的,否则称为非线性可分的。

1.2 分类间隔

需要有一个指标来衡量解决方案(即我们通过训练建立的分类模型)的好坏,而分类间隔是一个比较好的指标。

函数间隔

在进行分类的时候,每一个样本由一个向量(就是那些数据特征所组成的向量)和一个标记(标示出这个样本属于哪个类别)组成:

D_{i}=(x_{i},y_{i})

其中 x_{i} 就是数据向量(维数很高),y_{i} 就是分类标记,在二元的线性分类中,这个表示分类的标记只有两个值,1 和 -1(用来表示属于还是不属于这个类)。

一个样本点到某个超平面的间隔可定义为:

\delta _{i}=y_{i}(w^{T}x_{i}+b)

注意到如果样本属于该类别,w^{T}x+b>0y_{i}>0

样本不属于该类别,w^{T}x+b<0y_{i}<0

表明 y_{i}(w^{T}x+b) 总是大于 0,而且它的值就等于 \left | w^{T}x+b \right |(也就是 \left | g(x_{i}) \right |)。

某一个样本的函数间隔就是: \left | w^{T}x+b \right |

定义全局样本上的函数间隔:min\left | w^{T}x_{i}+b \right | 其中 i=1,2,...,m

即在训练样本上分类正例和负例确信度最小的函数间隔。

几何间隔

为了限制 w 和 

支持向量机(SVM算法)是一种机器学习算法。训练好的模型的算法复杂度由支持向量的个数决定,而非数据的维度,所以SVM不太容易产生过拟合。SVM训练出来的模型完全依赖于支持向量,即便去除训练集中所有非支持向量的点并重复训练过程,结果仍会得到相同的模型。若一个SVM训练得出的支持向量个数较少,其训练出的模型较易被泛化[^1]。 SVM有硬间隔和软间隔之分。硬间隔的SVM适用于线性可分的数据,算法能对所有样本进行正确划分;而软间隔问题可解决实际中疑似线性可分数据的划分,允许算法对部分样本的划分存在误差,即某些样本点不满足线性可分中函数间隔大于1的约束条件。线性支持向量机对每个实例引入一个松弛变量,使函数间隔加上松弛变量大于等于1,对应线性可分时的硬间隔最大化,线性支持向量机可称为软间隔最大化问题[^2]。 在实际应用中,以鸢尾花数据集为例,可使用SVM算法进行相关操作。选取前两个特征进行可视化,将数据集划分为训练集和测试集,使用线性核的SVM进行训练,对测试集进行预测,并输出混淆矩阵和分类报告,还可绘制决策边界[^3]。 ```python from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.svm import SVC from sklearn.metrics import confusion_matrix, classification_report import matplotlib.pyplot as plt import numpy as np # 加载鸢尾花数据集 iris = datasets.load_iris() # 选取前两个特征 X = iris.data[:, :2] y = iris.target # 划分数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 训练模型 model = SVC(kernel='linear') model.fit(X_train, y_train) # 预测 y_pred = model.predict(X_test) # 输出混淆矩阵和分类报告 print("混淆矩阵:") print(confusion_matrix(y_test, y_pred)) print("分类报告:") print(classification_report(y_test, y_pred)) # 可视化决策边界 x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02)) Z = model.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) plt.contourf(xx, yy, Z, alpha=0.4) plt.scatter(X[:, 0], X[:, 1], c=y, alpha=0.8) plt.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值