📅  最后修改于: 2023-12-03 14:49:50.797000             🧑  作者: Mango
支持向量机(Support Vector Machine, SVM)是一种常见的分类算法。SVM可以用于二分类和多分类问题,其优点在于具有较高的准确度和良好的泛化性能。
SVM基于结构风险最小化原则,学习的目标是求解一个能够将正负样本完全分离的超平面。超平面的方程为:
$$ \vec{w} \cdot \vec{x} - b = 0 $$
其中 $\vec{w}$ 是法向量,$\vec{x}$ 是样本数据,$b$ 是偏置项。正负样本应该满足如下约束条件:
$$ \begin{cases} \vec{w} \cdot \vec{x}_i - b \geqslant 1, & y_i = +1 \ \vec{w} \cdot \vec{x}_i - b \leqslant -1, & y_i = -1 \end{cases} $$
其中 $y_i$ 是样本的类别标签,可以是 $+1$ 或 $-1$。SVM的学习目标是最大化超平面到正负样本之间的间隔,即最大化 $2/|\vec{w}|$,等价于最小化 $1/2 |\vec{w}|^2$。因此,SVM问题可以转化为以下优化问题:
$$ \min_{\vec{w},b} \frac{1}{2}|\vec{w}|^2 \ s.t. \ y_i (\vec{w}\cdot\vec{x}_i-b) \geqslant 1 $$
当数据线性不可分时,可以通过引入惩罚因子 $\xi_i\geqslant0$,对样本违反约束条件的情况进行处理。对于上述优化问题可以修改为:
$$ \min_{\vec{w},b} \frac{1}{2}|\vec{w}|^2 + C\sum_{i=1}^{m}\xi_i \ s.t. \ y_i (\vec{w}\cdot\vec{x}_i-b) \geqslant 1-\xi_i $$
其中常数 $C$ 可以根据实际情况进行调整。
在Python中,可以使用sklearn库中的svm模块来训练SVM。
在进行分类任务时,首先需要准备训练数据和测试数据。假设我们要对鸢尾花数据进行分类,可以使用如下代码读取数据集:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 载入数据集
iris = load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=42)
使用sklearn库中的svm模块可以很方便地训练SVM模型。以下代码演示了如何使用线性核函数训练SVM模型:
from sklearn.svm import SVC
# 定义模型
model = SVC(kernel='linear', C=1)
# 训练模型
model.fit(X_train, y_train)
其中,kernel
指定使用的核函数类型,可以选择linear
、rbf
等,C
指定正则化强度,具体数值应根据实际情况进行调整。
可以使用如下代码对SVM模型进行评估:
from sklearn.metrics import accuracy_score
# 预测测试集
y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
其中,accuracy_score
函数可以计算模型在测试集上的准确率。
本文介绍了支持向量机(SVM)的基本原理和使用Python实现的方法。通过准备训练数据、训练模型和对模型进行评估,可以很容易地应用SVM算法进行数据分类任务。SVM算法具有较高的准确度和泛化性能,在一些问题上具有良好的效果。