flash型的著名网站网站增加栏目费用
flash型的著名网站,网站增加栏目费用,杭州网站的建设,陕西建站公司简介 SVM是一种二类分类模型#xff0c;其基本模型定义为特征空间上的间隔最大的线性分类器#xff0c;即支持向量机的学习策略便是间隔最大化#xff0c;最终可转化为一个凸二次规划问题的求解。或者简单的可以理解为就是在高维空间中寻找一个合理的超平面将数据点分隔开来…简介 SVM是一种二类分类模型其基本模型定义为特征空间上的间隔最大的线性分类器即支持向量机的学习策略便是间隔最大化最终可转化为一个凸二次规划问题的求解。或者简单的可以理解为就是在高维空间中寻找一个合理的超平面将数据点分隔开来其中涉及到非线性数据到高维的映射以达到数据线性可分的目的。 训练数据线性可分时通过硬间隔最大化学习一个线性分类器即线性可分支持向量机又称为硬间隔支持向量机训练数据近似线性可分时通过软间隔最大化也学习一个线性分类器即线性支持向量机也称为软间隔支持向量机训练数据线性不可分时通过使用核技巧和软间隔最大化学习非线性支持向量机。
线性可分支持向量机和硬间隔最大化
接下来主要是手写的笔记主要参考
《统计学习方法》SVM详解(包含它的参数C为什么影响着分类器行为)-scikit-learn拟合线性和非线性的SVM机器学习常见算法个人总结面试用SVM-支持向量机算法概述机器学习算法与Python实践之二支持向量机SVM初级机器学习算法与Python实践之三支持向量机SVM进阶机器学习算法与Python实践之四支持向量机SVM实现 关于凸函数凸集是指有这么一个点的集合其中任取两个点连一条直线这条线上的点仍然在这个集合内部因此说“凸”是很形象的。例如下图对于凸函数在数学表示上满足约束条件是仿射函数也就是线性的Axb的形式来说局部最优就是全局最优但对非凸函数来说就不是了。 支持向量是训练数据集的样本点中与分离超平面距离最近的样本点的实例。 如下图所示 图中对类1即Class 1的支持向量就在超平面H2:wxb−1H_2: wx+b=-1上而对于类2即Class 2正类的支持向量就在超平面H1:wxb1H_1: wx+b=1上。而在这两个超平面中间的距离即图中标着m的距离称为间隔它依赖于分离超平面的法向量ww,等于2||w||\frac{2}{|| w ||}而两个超平面和H1和H2和H_1 和H_2称为间隔平面。
在决定分离超平面时只有支持向量其作用其他实例点并不起作用。如果移动支持向量将改变所求的解。正是因为支持向量在确定分离超平面中起着决定性作用 所以将这种分类模型称为支持向量机。支持向量的个数一般很少所以支持向量机由很少的“重要的”训练样本确定。
线性支持向量机和软间隔最大化 核函数 采用不同的核函数就相当于采用不同的相似度的衡量方法。从计算的角度不管Φ(x)Φ(x)变换的空间维度有多高甚至是无限维函数就是无限维的这个空间的线性支持向量机的求解都可以在原空间通过核函数进行这样就可以避免了高维空间里的计算而计算核函数的复杂度和计算原始样本内积的复杂度没有实质性的增加。 一般情况下RBF效果是不会差于Linear 但是时间上RBF会耗费更多 下面是吴恩达的见解 如果Feature的数量很大跟样本数量差不多这时候选用LR或者是Linear Kernel的SVM如果Feature的数量比较小样本数量一般不算大也不算小选用SVMGaussian Kernel如果Feature的数量比较小而样本数量很多需要手工添加一些feature变成第一种情况 更多有关核函数可以参考【模式识别】SVM核函数和SVM的核函数如何选取?–知乎。
这里总结一下支持向量机的基本思想可以概括为首先通过非线性变换将输入空间变换到一个高维的空间然后在这个新的空间求最优分类面即最大间隔分类面而这种非线性变换是通过定义适当的内积核函数来实现的。**SVM实际上是根据统计学习理论依照结构风险最小化的原则提出的要求实现两个目的**1两类问题能够分开经验风险最小2margin最大化风险上界最小既是在保证风险最小的子集中选择经验风险最小的函数。
SVM优缺点
优点
使用核函数可以向高维空间进行映射使用核函数可以解决非线性的分类分类思想很简单就是将样本与决策面的间隔最大化分类效果较好
缺点
对大规模数据训练比较困难无法直接支持多分类但是可以使用间接的方法来做
多类分类
直接法
直接在目标函数上进行修改将多个分类面的参数求解合并到一个最优化问题中通过求解该优化就可以实现多分类。但是计算复杂度很高实现起来较为困难。
间接法 1 一对多方法就是每次训练的时候设置其中某个类为一类其余所有类为另一个类。比如有A,B,C,D四个类第一次A是一个类{B,C,D}是一个类训练一个分类器第二次B是一个类然后A,C,D是一个类训练一个分类器依次类推。因此如果总共有nn个类,最终将训练nn个分类器。测试的时候将测试样本都分别送入所有分类器中取得到最大值的类别作为其分类结果。这是因为到分类面距离越大分类越可信。 这种方法的优点是每个优化问题的规模比较小而且分类速度很快因为分类器数目和类别数目相同但是有时会出现这样两种情况对一个测试样本每个分类器都得到它属于分类器所在类别或者都不属于任意一个分类器的类别。前者称为分类重叠现象后者叫不可分类现象。前者可以任意选择一个结果或者就按照其到每个超平面的距离来分哪个远选哪个类别而后者只能分给新的第n1n+1个类别了。最大的缺点还是由于将n−1n-1个类别作为一个类别其数目会数倍于只有1个类的类别这样会人为造成数据集偏斜的问题。 2 一对一方法是任意两个类都训练一个分类器那么nn个类就需要n(n−1)2\frac{n(n-1)}{2}个分类器。预测的时候通过投票选择最终结果。 这个方法同样会有分类重叠的现象但不会有不可分类现象因为不可能所有类别的票数都是0。此外就是计算代价会很大。 3 层次支持向量机H-SVMs。层次分类法首先将所有类别分成两个子类再将子类进一步划分成两个次级子类如此循环直到得到一个单独的类别为止。 4 DAG-SVMS是由Platt提出的决策导向的循环图DDAG导出的,是针对“一对一”SVMS存在误分、拒分现象提出的。 序列最小最优化算法(SMO)
SMO是用于快速求解SVM的是一种启发式算法。 基本思路如下如果所有变量的解都满足此最优化问题的KKT条件那么这个最优化问题的解就得到了。因为KKT条件是该最优化问题的充分必要条件。否则它选择凸二次规划的两个变量其他的变量保持不变然后根据这两个变量构建一个二次规划问题这个二次规划关于这两个变量解会更加的接近原始二次规划的解通过这样的子问题划分可以大大增加整个算法的计算速度关于这两个变量
其中一个是严重违反KKT条件的一个变量另一个变量由约束条件自动确定。
整个SMO算法分为两部分求解两个变量二次规划的解析方法和选择变量的启发式方法。 SMO称选择第一个变量的过程为外层循环。外层循环在训练样本中选取违反KKT条件最严重的样本点并将其对应的变量作为第一个变量。具体的检验训练样本(xi,yix_i, y_i)是否满足KKT条件也就是 该检验是在εε范围内进行的。在检验过程中,外层循环首先遍历所有满足条件0αjC0的样本点即在间隔边界上的支持向量点检验他们是否满足KKT条件然后选择违反KKT条件最严重的αiα_i。如果这些样本点都满足KKT条件那么遍历整个训练集检验他们是否满足KKT条件然后选择违反KKT条件最严重的αiα_i。
优先选择遍历非边界数据样本因为非边界数据样本更有可能需要调整边界数据样本常常不能得到进一步调整而留在边界上。由于大部分数据样本都很明显不可能是支持向量因此对应的αα乘子一旦取得零值就无需再调整。遍历非边界数据样本并选出他们当中违反KKT 条件为止。当某一次遍历发现没有非边界数据样本得到调整时,遍历所有数据样本,以检验是否整个集合都满足KKT条件。如果整个集合的检验中又有数据样本被进一步进化,则有必要再遍历非边界数据样本。这样,不停地在遍历所有数据样本和遍历非边界数据样本之间切换,直到整个样本集合都满足KKT条件为止。以上用KKT条件对数据样本所做的检验都以达到一定精度ε就可以停止为条件。如果要求十分精确的输出算法,则往往不能很快收敛。对整个数据集的遍历扫描相当容易,而实现对非边界αiα_i的扫描时首先需要将所有非边界样本的αiα_i值也就是满足0αiC0保存到新的一个列表中然后再对其进行遍历。同时该步骤跳过那些已知的不会改变的αiα_i值。 SMO称选择第2个变量的过程为内层循环。第2个变量选择的标准是希望能使α2\alpha_2有足够大的变化。 记g(x)∑Ni1αiyiK(xi,x)bg(x) = \sum_{i=1}^N \alpha_i y_iK(x_i, x) + b, 令Eig(xi)−yi(∑Ni1αiyiK(xi,x)b)−yi,i1,2E_i = g(x_i) - y_i= (\sum_{i=1}^N \alpha_i y_iK(x_i, x) + b) - y_i,\qquad i = 1, 2。
当i1,2i = 1, 2时EiE_i是函数g(xi)g(x_i)对输入xix_i的预测值与真实输出yiy_i之差。
对于第2个变量α2\alpha_2的选择一个简单的做法是选择让|E1−E2||E_1 - E_2|最大的变化。为了节省计算时间将所有EiE_i值保存在一个列表中。
如果上述方法选择的变量不能使目标函数有足够的下降那么采用以下启发式规则继续选择第2个变量。遍历在间隔边界上的支持向量点依次将其对应的向量作为α2\alpha_2试用直到目标函数有足够的下降。若找不到合适的则遍历训练数据集若仍找不到合适的α2\alpha_2则放弃第一个变量α1\alpha_1再通过外层循环寻求另外的α1\alpha_1。
选择这两个拉格朗日乘子后我们需要先计算这些参数的约束值。然后再求解这个约束最大化问题,下面用αi,αj\alpha_i, \alpha_j表示选择的第1个和第2个变量。
首先我们需要给αjα_j找到边界L≤αj≤HL\le α_j \le H以保证αjα_j满足0≤αj≤C0\le α_j\le C的约束。这意味着αjα_j必须落入这个盒子中。由于只有两个变量(αi,αjα_i, α_j)约束可以用二维空间中的图形来表示如下图 不等式约束使得(αi,αjα_i, α_j)在盒子[0, C]x[0, C]内等式约束使得(αi,αjα_i, α_j)在平行于盒子[0, C]x[0, C]的对角线的直线上。因此要求的是目标函数在一条平行于对角线的线段上的最优值。这使得两个变量的最优化问题成为实质的单变量的最优化问题。由图可以得到αjα_j的上下界可以通过下面的方法得到 我们优化的时候αjα_j必须要满足上面这个约束。也就是说上面是αjα_j的可行域。然后我们开始寻找αjα_j使得目标函数最大化。通过推导得到αjα_j的更新公式如下 这里EkE_k可以看做对第kk个样本,SVM的输出与期待输出,也就是样本标签的误差。而ηη实际上是度量两个样本和i和j和i和j的相似性的。在计算ηη的时候,我们需要使用核函数,那么就可以用核函数来取代上面的内积。得到新的αjα_j后我们需要保证它处于边界内。换句话说如果这个优化后的值跑出了边界L和H我们就需要简单的裁剪将αjα_j收回这个范围 最后得到优化的αjα_j后我们需要用它来计算αiα_i 到这里和αi和αj和α_i和α_j的优化就完成了
最后就是更新阈值bb了,使得两个样本和i和j和i和j都满足KKT条件。如果优化后αiα_i不在边界上也就是满足0αiC0这时候根据KKT条件可以得到yigi(xi)1y_ig_i(x_i)=1这样我们才可以计算bb),那下面的阈值b1b_1是有效的因为当输入xix_i时它迫使SVM输出yiy_i。 同样如果0αjC0 ,那么下面的b2b_2也是有效的 如果0αiC0 和0αjC0 都满足那么和b1和b2和b_1和b_2都有效而且他们是相等的。如果他们两个都处于边界上也就是αi0α_i=0或者αiCα_i=C同时αj0α_j=0或者αjCα_j=C那么在b1b_1和b2b_2之间的阈值都满足KKT条件一般我们取他们的平均值bb1b22b=\frac{b1+b2}{2}。所以总的来说对bb的更新如下:每次完成两个变量的优化后,还必须更新对应的EiE_i值并将它们保存在列表中。
KKT条件分析
KKT条件具体可以查看深入理解拉格朗日乘子法Lagrange Multiplier) 和KKT条件。
假设我们优化得到的最优解是和αi,βi,ξi,w和b和α_i,β_i, ξ_i, w和b。我们的最优解需要满足KKT条件 同时βi,ξiβ_i, ξ_i都需要大于等于0而αiα_i需要在0和C之间。那可以分三种情况讨论 因此KKT条件变成了 第一个式子表明如果αi0α_i=0那么该样本落在两条间隔线外。第二个式子表明如果αiCα_i=C那么该样本有可能落在两条间隔线内部也有可能落在两条间隔线上面主要看对应的松弛变量的取值是等于0还是大于0第三个式子表明如果0αiC0那么该样本一定落在分隔线上这点很重要bb就是拿这些落在分隔线上的点来求的,因为在分割线上wTx+b=1w^Tx+b=1或者wTxb−1w^Tx+b=-1嘛才是等式在其他地方都是不等式求解不了bb)。具体形象化的表示如下:通过KKT条件可知,αiα_i不等于0的都是支持向量它有可能落在分隔线上也有可能落在两条分隔线内部。KKT条件是非常重要的在SMO也就是SVM的其中一个实现算法中我们可以看到它的重要应用。
代码实现
下面是线性SVM的代码实现
from sklearn import datasets
import numpy as np
from sklearn.cross_validation import train_test_splitiris datasets.load_iris() # 由于Iris是很有名的数据集scikit-learn已经原生自带了。
X iris.data[:, [2, 3]]
y iris.target # 标签已经转换成012了
X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state0) # 为了看模型在没有见过数据集上的表现随机拿出数据集中30%的部分做测试# 为了追求机器学习和最优化算法的最佳性能我们将特征缩放
from sklearn.preprocessing import StandardScaler
sc StandardScaler()
sc.fit(X_train) # 估算每个特征的平均值和标准差
sc.mean_ # 查看特征的平均值由于Iris我们只用了两个特征所以结果是array([ 3.82857143, 1.22666667])
sc.scale_ # 查看特征的标准差这个结果是array([ 1.79595918, 0.77769705])
X_train_std sc.transform(X_train)
# 注意这里我们要用同样的参数来标准化测试集使得测试集和训练集之间有可比性
X_test_std sc.transform(X_test)
X_combined_std np.vstack((X_train_std, X_test_std))
y_combined np.hstack((y_train, y_test))# 导入SVC
from sklearn.svm import SVC
svm SVC(kernellinear, C1.0, random_state0) # 用线性核你也可以通过kernel参数指定其它的核。
svm.fit(X_train_std, y_train)
# 打印决策边界这个函数是我自己写的如果你想要的话我发给你
plot_decision_regions(X_combined_std, y_combined, classifiersvm, test_idxrange(105,150))
plt.xlabel(petal length [standardized])
plt.ylabel(petal width [standardized])
plt.legend(locupper left)
plt.show()
接下来是使用非线性SVM的代码
svm SVC(kernelrbf, random_state0, gammax, C1.0) # 令gamma参数中的x分别等于0.2和100.0
svm.fit(X_train_std, y_train) # 这两个参数和上面代码中的训练集一样
plot_decision_regions(X_combined_std, y_combined, classifiersvm, test_idxrange(105,150))
plt.xlabel(petal length [standardized])
plt.ylabel(petal width [standardized])
plt.legend(locupper left)
plt.show()
SVM的知识点就总结到这里还是参考了不少文章和看书才完成但是需要继续通过实践才能加深对SVM的了解。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/85278.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!