支持向量机(SVM)原理及应用实例

目录

引言

算法思想

算法特点

核函数

线性可分与线性不可分

算法流程

应用领域

具体应用案例

数据集

代码实现

结果展示


引言

支持向量机(Support Vector Machine,简称SVM)是一种在机器学习领域广泛使用的算法,特别是在分类问题中表现出色。以下是对支持向量机的详细介绍:

支持向量机是一种按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier)。它的基本模型是定义在特征空间上的间隔最大的线性分类器,其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane)。SVM的目标是找到一个超平面以最好地划分数据点,同时最大化不同类别数据点之间的间隔

算法思想

找到集合边缘上的若干数据(称为支持向量(Support Vector))用这些点找出一个平面(称为决策面),使得支持向量到该平面的距离最大。

算法特点

  1. 间隔最大化:SVM的核心思想是间隔最大化,即找到一个超平面,使得距离该超平面最近的样本点的间隔(即距离)最大。这样的超平面对未知的新实例有很好的分类预测能力。
  2. 稀疏性:SVM在训练完成后,大部分的训练样本都不需要保留,最终模型仅与支持向量有关,因此具有稀疏性。
  3. 稳健性:SVM通过使用铰链损失函数(hinge loss)和正则化项来优化结构风险,使得模型对于噪声和异常值具有较好的鲁棒性。

核函数

        核函数是一种特殊的函数,它能够在不显式地计算高维空间中的非线性映射函数的情况下,通过计算输入空间中的点之间的某种相似度(或内积)来间接地实现这种映射。具体来说,如果存在一个从输入空间到特征空间的映射φ(x),使得对于所有的x和z,都有K(x, z) = φ(x) z),则称K(x, z)为核函数。

        这样我们就可以使 用原来的推导来进行计算,只是所有的 推导是在新的空间,而不是在原来的空 间中进行,即用核函数来替换当中的内积。

高斯核函数,设 x,z\in R^{n},将如下形式的函数

K(x,z)=e^{-\frac{\parallel x-z\parallel^{2} }{2\delta ^{2}}}

称为高斯核函数,其中\delta为常数。

线性可分与线性不可分

  1. 线性可分:对于线性可分的数据集,SVM的目标是找到一个能够将正负实例完全分开的超平面,并最大化超平面与最近样本点之间的间隔。
  2. 线性不可分:对于线性不可分的数据集,SVM通过引入软间隔(soft margin)的概念,允许一些样本点被错误分类,并通过调整正则化参数来控制这种错误分类的程度。此外,还可以通过核方法(kernel method)将非线性问题转化为线性问题来求解。

算法流程

SVM的算法流程大致可以分为以下几个步骤:

  1. 输入数据:包括训练数据集和测试数据集。
  2. 选择核函数:对于非线性问题,需要选择合适的核函数将数据映射到高维空间。
  3. 求解最优化问题:通过求解一个凸二次规划问题,找到最优的超平面参数(包括法向量和截距)。
  4. 分类预测:使用训练好的模型对测试数据集进行分类预测。

应用领域

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()

结果展示

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值