目录
引言
支持向量机(Support Vector Machine,简称SVM)是一种在机器学习领域广泛使用的算法,特别是在分类问题中表现出色。以下是对支持向量机的详细介绍:
支持向量机是一种按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier)。它的基本模型是定义在特征空间上的间隔最大的线性分类器,其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane)。SVM的目标是找到一个超平面以最好地划分数据点,同时最大化不同类别数据点之间的间隔
算法思想
找到集合边缘上的若干数据(称为支持向量(Support Vector))用这些点找出一个平面(称为决策面),使得支持向量到该平面的距离最大。
算法特点
- 间隔最大化:SVM的核心思想是间隔最大化,即找到一个超平面,使得距离该超平面最近的样本点的间隔(即距离)最大。这样的超平面对未知的新实例有很好的分类预测能力。
- 稀疏性:SVM在训练完成后,大部分的训练样本都不需要保留,最终模型仅与支持向量有关,因此具有稀疏性。
- 稳健性:SVM通过使用铰链损失函数(hinge loss)和正则化项来优化结构风险,使得模型对于噪声和异常值具有较好的鲁棒性。
核函数
核函数是一种特殊的函数,它能够在不显式地计算高维空间中的非线性映射函数的情况下,通过计算输入空间中的点之间的某种相似度(或内积)来间接地实现这种映射。具体来说,如果存在一个从输入空间到特征空间的映射φ(x),使得对于所有的x和z,都有K(x, z) = φ(x) z),则称K(x, z)为核函数。
这样我们就可以使 用原来的推导来进行计算,只是所有的 推导是在新的空间,而不是在原来的空 间中进行,即用核函数来替换当中的内积。
高斯核函数,设 ,将如下形式的函数
称为高斯核函数,其中为常数。
线性可分与线性不可分
- 线性可分:对于线性可分的数据集,SVM的目标是找到一个能够将正负实例完全分开的超平面,并最大化超平面与最近样本点之间的间隔。
- 线性不可分:对于线性不可分的数据集,SVM通过引入软间隔(soft margin)的概念,允许一些样本点被错误分类,并通过调整正则化参数来控制这种错误分类的程度。此外,还可以通过核方法(kernel method)将非线性问题转化为线性问题来求解。
算法流程
SVM的算法流程大致可以分为以下几个步骤:
- 输入数据:包括训练数据集和测试数据集。
- 选择核函数:对于非线性问题,需要选择合适的核函数将数据映射到高维空间。
- 求解最优化问题:通过求解一个凸二次规划问题,找到最优的超平面参数(包括法向量和截距)。
- 分类预测:使用训练好的模型对测试数据集进行分类预测。
应用领域
SVM在多个领域都有广泛的应用,包括但不限于:
- 文本分类:用于识别文档的主题或情感倾向。
- 图像识别:在图像处理和计算机视觉中用于目标检测和识别。
- 生物信息学:在基因表达数据分析和蛋白质功能预测中发挥作用。
- 金融分析:用于信用评分、欺诈检测等金融领域的问题。
具体应用案例
数据集
数据集是著名的鸢尾花(Iris)数据集,它常被用于分类算法的测试和教学。数据集包含了150个样本,每个样本都有4个特征(花萼长度Sepal.Length、花萼宽度Sepal.Width、花瓣长度Petal.Length、花瓣宽度Petal.Width)和一个目标变量(Species),即鸢尾花的种类。在这个数据集中,鸢尾花被分为三种类型:Setosa、Versicolour和Virginica。
这个数据集非常适合用于分类算法的学习和测试,因为它包含了足够数量的样本和特征,同时又有清晰的分类标签。通过使用这个数据集,可以训练模型来预测给定花萼和花瓣的尺寸时,鸢尾花的种类
代码实现
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
# 读取 CSV 文件
iris_data = pd.read_csv('D:\iris.csv')
from sklearn.preprocessing import LabelEncoder
# 创建 LabelEncoder 对象
label_encoder = LabelEncoder()
# 将 'Species' 列转换为数值
iris_data['Species'] = label_encoder.fit_transform(iris_data['Species'])
# 将 'Species' 列作为目标变量 y,其余列作为特征变量 X
X = iris_data.drop('Species', axis=1)
y = iris_data['Species']
# 划分训练集和测试集( 70% 训练集,30% 测试集)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 标准化特征
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 初始化 SVM 模型
model = SVC(kernel='linear')
# 训练模型
model.fit(X_train_scaled, y_train)
# 使用测试集进行预测
y_pred = model.predict(X_test_scaled)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'模型准确率: {accuracy:.2f}')
# 选择两个特征绘图
features = ['Sepal.Length', 'Sepal.Width']
X_test_plot = X_test[features]
# 绘制实际结果
plt.figure(figsize=(10, 6))
colors = ['red', 'green', 'blue']
for i in range(3):
plt.scatter(X_test_plot[y_test == i][features[0]], X_test_plot[y_test == i][features[1]],
label=f'Actual: {label_encoder.inverse_transform([i])[0]}', color=colors[i], marker='o', s=30,
edgecolor='black')
# 绘制预测结果
for i in range(3):
plt.scatter(X_test_plot[y_pred == i][features[0]], X_test_plot[y_pred == i][features[1]],
label=f'Predicted: {label_encoder.inverse_transform([i])[0]}', color=colors[i], marker='x', s=50,
alpha=0.7)
plt.xlabel(features[0])
plt.ylabel(features[1])
plt.title('Iris Dataset Classification Results')
plt.legend()
plt.show()