支持向量机

1、支持向量机概念

  支持向量机(Support Vector Machine, SVM)是一类按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面。

  SVM使用铰链损失函数计算经验风险并在求解系统中加入了正则化项以优化结构风险,是一个具有稀疏性和稳健性的分类器 [2]。SVM可以通过核方法进行非线性分类,是常见的核学习方法之一 。

2、最大间隔与分类

  最大间隔分类是一种基于支持向量机(SVM)的分类方法,它的目标是找到一个最大间隔的超平面,将不同类别的数据点分开。这个超平面被称为决策边界,位于两个不同类别之间。最大间隔分类器的优点是对于新样本的分类具有很高的准确性和鲁棒性。

  在样本线性可分的情况下,可行的分类超平面可能会有很多,如下图的L1、L2和L3。

  

  那么怎么选择一个最好的呢?从上图我们可以直观看出,L2比另外两条分界线要更好,这是因为L2离样本的距离更远一些,让人觉得确信度更高。这好比人(相当于样本)站在离悬崖边(分类边界)越远,人就会感到越安全(分类结果是安全还是危险)。从统计的角度讲,由于正负样本可以看作从两个不同的分布随机抽样而得,若分类边界与两个分布的距离越大,抽样出的样本落在分类边界另一边的概率就会越小。

  SVM正是基于这种直观思路来确定最佳分类超平面的:通过选取能够最大化类间间隔的超平面,得到一个具有高确信度和泛化能力的分类器,即最大间隔分类器。

3、对偶问题
  

对偶问题是一种将原始优化问题转换为另一个等价问题的技术。对于某些优化问题,求解原始问题可能比较困难,但是通过对偶问题可以更容易地求解。

具体地说,在最大间隔分类的情况下,原始问题是要找到一个超平面,使得所有训练样本都被正确地分类,并且该超平面与不同类别的样本之间的距离最大。这是一个凸优化问题,可以使用现代优化算法来解决。然而,如果使用对偶问题,可以将原始问题转化为另一个等价的问题,其中变量的数量较少,从而更容易求解。

4、核函数

 将原始空间中的向量作为输入向量,并返回特征空间(转换后的数据空间,可能是高维)中向量的点积的函数称为核函数。


  举个例子:假设我们有一个二维的数据集,其中的数据点不是线性可分的。我们可以使用高斯核函数将这些数据映射到一个更高维的空间,使得数据在新的特征空间中呈现线性可分的特性。具体地,高斯核函数可以定义为:

  其中,x 和 x′ 是原始空间中的两个数据点,σ 是高斯核函数的参数。我们可以将每个数据点映射到一个无限维的特征空间中,其中每个维度对应于高斯核函数中的一个基函数。具体地,我们可以将每个数据点 x 映射到一个特征向量 ϕ(x) 中,其中:

  在新的特征空间中,我们可以使用线性分类器(如感知机)来对数据进行分类。具体地,我们可以使用以下的线性分类器:

5、软间隔与正则化

  软间隔:指的是在最大间隔分类时允许一些训练样本被错误分类。而硬间隔则要求所有训练样本都被正确分类。软间隔可以提高模型的鲁棒性和泛化能力,因为它可以在一定程度上容忍噪声或离群点。然而,软间隔的缺点是可能导致过拟合问题,因此需要采取措施来避免这种情况。

  正则化:用于避免过拟合问题。在SVM中,通常使用L2正则化或L1正则化来约束模型参数。L2正则化将一个惩罚项添加到目标函数中,该惩罚项是模型参数向量的平方和的乘积与一个系数之积。L1正则化将一个惩罚项添加到目标函数中,该惩罚项是模型参数向量的绝对值的和与一个系数之积。这些惩罚项可以限制模型参数的大小并防止过拟合。

6、支持向量机实现

# 导入所需的库
from sklearn import svm
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

# 创建一个用于分类的示例数据集
X, y = make_blobs(n_samples=100, centers=2, random_state=0, cluster_std=0.6)

# 创建SVM分类器对象
clf = svm.SVC(kernel='linear')

# 使用数据训练分类器
clf.fit(X, y)

# 生成一些新的数据点进行预测
new_data = [[3, 4], [4, 2]]
print("预测结果:", clf.predict(new_data))

# 可视化分类结果
plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired)

# 绘制决策边界
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()

# 创建网格来评估模型
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)

# 绘制决策边界和支持向量
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,
           linestyles=['--', '-', '--'])
ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100,
           linewidth=1, facecolors='none', edgecolors='k')
plt.show()

7、SVM优缺点

  

优点:1、支持向量机算法可以解决小样本情况下的机器学习问题,简化了通常的分类和回归等问题。
2、由于采用核函数方法克服了维数灾难和非线性可分的问题,所以向高维空间映射时没有增加计算的复杂性。换句话说,由于支持向量计算法的最终决策函数只由少数的支持向量所确定,所以计算的复杂性取决于支持向量的数目,而不是样本空间的维数。
3、支持向量机算法利用松弛变量可以允许一些点到分类平面的距离不满足原先要求,从而避免这些点对模型学习的影响。


缺点:1、支持向量机算法对大规模训练样本难以实施。这是因为支持向量机算法借助二次规划求解支持向量,这其中会涉及m阶矩阵的计算,所以矩阵阶数很大时将耗费大量的机器内存和运算时间。
2、经典的支持向量机算法只给出了二分类的算法,而在数据挖掘的实际应用中,一般要解决多分类问题,但支持向量机对于多分类问题解决效果并不理想。
3、SVM算法效果与核函数的选择关系很大,往往需要尝试多种核函数,即使选择了效果比较好的高斯核函数,也要调参选择恰当的  参数。另一方面就是现在常用的SVM理论都是使用固定惩罚系数 ,但正负样本的两种错误造成的损失是不一样的。
 

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值