机器学习--支持向量机(SVM)

目录

1.支持向量机简介

1.1 支持向量机的类别

1.2 最大间隔

1.3 核函数

1.4 实验步骤

2 代码实现

2.1 导入所需库

2.2 生成线性可分数据

2.3 划分数据集

2.4 数据标准化

2.5  创建SVM分类器实例

2.6 训练SVM分类器

2.7 预测测试集

2.8 可视化

2.9 可视化结果

3 总结


1.支持向量机简介

支持向量机(Support Vector Machine,SVM)是一种二分类模型,SVM可以用于线性和非线性分类问题,回归以及异常值检测。其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。支持向量机的学习算法是求解凸二次规划的最优化算法。

其基本原理是通过在特征空间中找到一个超平面,将不同类别的样本分开,并且使得离超平面最近的样本点到超平面的距离最大化

1.1 支持向量机的类别

- 分割超平面:将上述数据集分隔开来的直线成为分隔超平面。对于二维平面来说,分隔超平面就是一条直线。对于三维及三维以上的数据来说,分隔数据的是个平面,称为超平面,也就是分类的决策边界。
- 间隔:点到分割面的距离,称为点相对于分割面的间隔。数据集所有点到分隔面的最小间隔的2倍,称为分类器或数据集的间隔。论文中提到的间隔多指这个间隔。SVM分类器就是要找最大的数据集间隔。 
- 支持向量:离分隔超平面最近的那些点。

1.2 最大间隔

我们假设平面上任意一点x的很坐标是x^{_{1}},纵坐标是x^{_{2}},则此点的类别是1 或 -1:

此时,超平面方程:

         

因为需要保证直线两边的点到此超平面的距离最大,所以我们需要计算点x xx到超平面的距离d :

                

观察上式中的分子,如果分子的绝对值里面是正数,说明类别为1;如果分子的绝对值里面是负数,说明类别为-1。所以我们可以把绝对值拿开,用y来代替:

                

所以点到直线的距离d dd就可以更新为:

                

1.3 核函数

核函数是支持向量机(SVM)中一个核心的概念,它使得SVM能够有效地处理非线性可分的数据

将样本从原始空间映射到一个更高维的特征空间, 使得样本在这个特征空间内线性可分

核函数的基本定义:核函数可以定义为一个函数,它接受两个低维空间中的向量作为输入,并返回它们在高维特征空间中的内积。这种方法避免了直接在高维空间中操作,因为那会涉及到复杂的运算和高计算成本。通过这种方式,数据可以在高维空间中变得线性可分,从而使用线性算法进行处理。
核函数的工作原理:通过将原始数据映射到更高维的空间中,数据点在这个新的空间中可以被线性超平面分隔。这种映射使得原本在低维空间中线性不可分的问题,在高维空间中变得线性可分。核函数通过计算数据的点积来实现这一点,而无需显式地构造高维空间中的数据表示,这称为“核技巧”。
常用的核函数类型:线性核函数主要用于原始特征空间本身即是线性可分的场景。多项式核函数可以将数据映射到一个更高阶的多项式空间,使数据在新的空间中线性可分。高斯核函数,也称为径向基函数(RBF),其特点是可以将数据映射到无限维的空间,提供强大的灵活性和泛化能力。此外,还有其他如Sigmoid核、拉普拉斯核等,每种核函数都有其特定的应用场景和优势。

1.4 实验步骤

2 代码实现

线性支持向量机

2.1 导入所需库

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

2.2 生成线性可分数据

   X, y = datasets.make_classification(n_features=2, n_redundant=0, n_informative=2, random_state=1, n_clusters_per_class=1)
   

2.3 划分数据集

使用`datasets.make_classification`函数生成了一个包含两个特征的线性可分数据集

   X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=1)
   

2.4 数据标准化

将数据集分为训练集和测试集,测试集的大小为40%,随机状态设置为1以确保可复现性。

   scaler = StandardScaler()
   X_train = scaler.fit_transform(X_train)
   X_test = scaler.transform(X_test)
   

2.5  创建SVM分类器实例

创建了一个`StandardScaler`对象,并使用它来标准化训练集和测试集的数据。标准化是为了确保权重不会因为特征的大小而偏袒某些特征

   svm = SVC(kernel='linear', C=1.0, random_state=0)
   

2.6 训练SVM分类器

创建了一个SVM分类器实例,其中`kernel='linear'`指定了使用线性核函数,`C=1.0`是正则化参数,`random_state=0`确保了随机性的可复现性。

   svm.fit(X_train, y_train)
   

2.7 预测测试集

使用训练集来训练SVM分类器

   y_pred = svm.predict(X_test)
   

2.8 可视化

使用训练好的SVM分类器来预测测试集的标签

   plt.figure(figsize=(8, 6))
   plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap='spring')
   plt.scatter(X_test[:, 0], X_test[:, 1],

2.9 可视化结果

3 总结

线性支持向量机(SVM)的优缺点:

优点:
1. **理论支持**:线性SVM是基于严格的数学理论的,特别是在处理线性可分数据时,它能够找到一个最优的线性分隔超平面。
2. **计算效率**:当数据集线性可分时,线性SVM的计算效率相对较高,因为其优化问题可以通过解析方法求解。
3. **易于理解**:线性模型通常更易于解释,因为它们的决策边界是线性的,这使得人们更容易理解模型是如何工作的。

缺点:
1. **数据限制**:线性SVM依赖于数据的线性可分性,这在现实世界的数据集中并不常见,导致其适用性受限。
2. **性能限制**:线性模型在处理复杂数据时性能可能不如非线性模型,因为它们不能捕捉数据的非线性关系。
3. **参数调整**:线性SVM的性能很大程度上依赖于正则化参数C的选择,这需要通过交叉验证来优化。

非线性支持向量机(SVM)的优缺点:

优点:
1. **适应性**:非线性SVM通过使用核技巧可以适应非线性数据,允许模型在更高维的特征空间中找到非线性决策边界。
2. **泛化能力**:非线性SVM通常具有较好的泛化能力,因为它们能够捕捉数据中的复杂模式。
3. **灵活性**:非线性SVM提供了多种核函数选择,如线性核、多项式核和径向基函数(RBF)核,可以根据数据的特点选择合适的核函数。

缺点:
1. **计算复杂性**:非线性SVM的训练和预测通常比线性SVM更复杂,因为它们涉及到了高维空间的优化问题,这可能导致更长的训练时间和更高的计算成本。
2. **过拟合风险**:非线性SVM在处理大量数据时可能会遇到过拟合问题,特别是在特征空间维度非常高的情况下。
3. **参数调整**:非线性SVM的参数选择,包括核函数类型和参数、正则化参数C等,通常更加复杂,需要通过交叉验证来优化。
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值