【机器学习】svm

一.原理部分

1. SVM 原理
a.SVM 是一种二类分类模型。它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器。

b.当训练样本线性可分时,通过硬间隔最大化(几何间隔),学习一个线性分类器,即线性可分支持向量机;

c.当训练数据近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器,即线性支持向量机;

d.当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。

松弛变量:
使用原因:一些离群点或者噪声点影响分界面;
解决方法:允许某些样本不满足约束:在这里插入图片描述
0/1损失函数非凸函数,不易求解,因此引入hinge函数作为SVM的损失函数。在这里插入图片描述
引入松弛变量,优化目标变成:
在这里插入图片描述
在这里插入图片描述

2. SVM 为什么采用间隔最大化
a.当训练数据线性可分时,间隔最大化解是唯一的。
b.这个划分超平面所产生的分类结果是最鲁棒的,对未见示例的泛化能力最强.
在这里插入图片描述
在这里插入图片描述
3.SVM为什么要从原始问题变为对偶问题来求解?
对偶问题往往更易求解,因为对偶问题将原始问题中的不等式约束转为了对偶问题中的等式约束。
方便核函数的引入
改变了问题的复杂度,由求特征向量w转化为求比例系数a,在原始问题下,求解的复杂度与样本的维度有关,即w的维度。在对偶问题下,只与样本数量有关。
(a) 目前处理的模型严重依赖于数据集的维度d,如果维度d太高就会严重提升运算时间;

(b) 对偶问题事实上把SVM从依赖d个维度转变到依赖N个数据点,考虑到在最后计算时只有支持向量才有意义,所以这个计算量实际上比N小很多。
对偶问题:引入拉格朗日乘子,可以得到以下拉格朗日函数:
在这里插入图片描述

求导:在这里插入图片描述

将上式代入拉格朗日函数:

在这里插入图片描述

由于对偶问题的性质,最小变为最大,求W的极值即可:

在这里插入图片描述
从KKT条件中得到,只有支持向量的不为0,其他情况的都为0.那么来一个新样本x后,就可以这样分类:
在这里插入图片描述
从对偶问题解出的过程需满足KKT(Karush-Kuhn-Tucker) 条件只有支持向量的不为0,其他情况的都为0.那么来一个新样本x后,就可以这样分类:f(x)
在这里插入图片描述
对偶问题求解方法:SMO.
将大优化的问题分解成多个小优化问题,这些小问题往往比较容易求解在这里插入图片描述,并且对他们进行顺序求解的结果与他们作为整体来求解的结果完全一致。

4,为什么SVM要引入核函数?

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

引入映射后的对偶问题:
在这里插入图片描述
在学习预测中,只定义核函数K(x,y),而不是显式的定义映射函数ϕ。因为特征空间维数可能很高,甚至可能是无穷维,因此直接计算ϕ(x)·ϕ(y)是比较困难的。相反,直接计算K(x,y)比较容易(即直接在原来的低维空间中进行计算,而不需要显式地写出映射后的结果)。

核函数的定义:K(x,y)=<ϕ(x),ϕ(y)>,即在特征空间的内积等于它们在原始样本空间中通过核函数K计算的结果

除了 SVM 之外,任何将计算表示为数据点的内积的方法,都可以使用核方法进行非线性扩展。

在这里插入图片描述
高斯核函数(BPF):
优点:
可以映射到无限维
决策边界更为多样
只有一个参数sigema,相比多项式核容易选择
缺点:
可解释性差(无限多维的转换,无法算w)
计算速度比较慢(解一个对偶问题)
容易过拟合(参数选不好时容易overfitting)

在实战中更多的是:

特征维数高选择线性核
样本数量可观、特征少选择高斯核(非线性核)
样本数量非常多选择线性核(避免造成庞大的计算量)

二.应用部分

1.为什么SVM对缺失数据敏感?

这里说的缺失数据是指缺失某些特征数据,向量数据不完整。SVM没有处理缺失值的策略(决策树有)。而SVM希望样本在特征空间中线性可分,所以特征空间的好坏对SVM的性能很重要。缺失特征数据将影响训练结果的好坏。

2.SVM多分类
一对多方法:每一次把某个样本定为正样本,其余样本作为负样本。

        优点:每个优化问题规模小,分类器少,分类速度快;

        缺点:每一个分类器都说它属于它那一类---分类重叠;每一个分类器都说它不是它那一类---不可分类现象。

一对一方法:每次选一个类的样本作正类样本,负类样本则变成只选一个类。  假设有四类A,B,C,D四类。在训练的时候我选择A,B; A,C; A,D; B,C; B,D;C,D所对应的向量作为训练集,然后得到六个训练结果,在测试的时候,把对应的向量分别对六个结果进行测试,然后采取投票形式,最后得到一组结果。

        优点:不会出现分类重叠现象。

3.防止SVM过拟合
解决过拟合的办法是为SVM引入了松弛变量ξ(slack variable),将SVM公式的约束条件改为:
在这里插入图片描述
4.SVM与LR的区别与联系
联系:(1)分类(二分类) (2)可加入正则化项
区别:(1)LR–参数模型;SVM–非参数模型?(2)目标函数:LR—logistical loss;SVM–hinge loss (3)SVM–support vectors;LR–减少较远点的权重 (4)LR–模型简单,好理解,精度低,可能局部最优;SVM–理解、优化复杂,精度高,全局最优,转化为对偶问题—>简化模型和计算 (5)LR可以做的SVM可以做(线性可分),SVM能做的LR不一定能做(线性不可分)

Reference:
https://blog.csdn.net/manduner/article/details/89893419
https://blog.csdn.net/cppjava_/article/details/68060439

https://blog.csdn.net/u010496169/article/details/73695164?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

https://cuijiahua.com/blog/2017/11/ml_8_svm_1.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
支持向量机(Support Vector Machine,SVM)是一种常用的机器学习算法,它可以用于分类和回归分析。SVM能够找到一个超平面,将不同类别的数据点有效地分开。 实现一个简单的SVM源代码,可以基于Python编程语言和scikit-learn库来实现。首先,需要导入所需的库和数据集。然后,对数据进行预处理,如标准化或归一化处理。接下来,使用svm模块的SVC类来创建一个SVM分类器,并通过fit()方法对数据进行拟合。最后,可以使用该模型对新的数据进行预测,并评估模型的性能。 下面是一个Python实现的简单SVM源代码示例: ```python # 导入所需的库 import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from sklearn.metrics import accuracy_score # 载入数据集 iris = datasets.load_iris() X = iris.data y = iris.target # 数据预处理 scaler = StandardScaler() X = scaler.fit_transform(X) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建SVM分类器 svm_classifier = SVC(kernel='linear', C=1.0) # 拟合数据 svm_classifier.fit(X_train, y_train) # 预测测试集 y_pred = svm_classifier.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print("SVM模型的准确率为:", accuracy) ``` 以上是一个简单的SVM源代码实现示例,该代码使用SVM算法对鸢尾花数据集进行分类,并计算了模型的准确率。通过学习和理解这个示例,可以更深入地理解SVM算法的实现原理和应用方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值