![](https://i-blog.csdnimg.cn/blog_migrate/9c103b1deba16ff1309fa5a4729a8304.png)
算法
支持向量机学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面。对于线性可分的训练数据集而言,线性可分分离超平面有无穷多个,但是几何间隔最大的分离超平面是唯一的。这里的间隔最大化又称为硬间隔最大化。而当训练数据集近似线性可分时,为软间隔最大化。
![](https://i-blog.csdnimg.cn/blog_migrate/5c672d2254c780453df82ab617523422.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e09ae5f97e022941716a5619ca5ceeb2.png)
1.初始化数据 ①对data数据转化为0-1浮点型 进行归一化处理 ![](https://i-blog.csdnimg.cn/blog_migrate/fea4309e91f508f295189b5f14fca665.png) ②将label值进行二值化 ![](https://i-blog.csdnimg.cn/blog_migrate/bfcaf88370678a3e17d020db42b56fee.png) 2.对SVM模型进行训练 (1)对SVM相关参数初始化 ① Sigma 高斯核中分母的σ ② C 软间隔中的惩罚参数 ③ toler 松弛变量 ![](https://i-blog.csdnimg.cn/blog_migrate/c8ea60d84b4ad2bdd3f3a2ca015f10cf.png) ④K:提前计算高斯核得到结果K ![](https://i-blog.csdnimg.cn/blog_migrate/4b7ffdea943e60b11e18f80d4244b776.png) ![](https://i-blog.csdnimg.cn/blog_migrate/7597a528449f346047324d08aecbd510.png) (2)迭代100次,超过迭代次数还未收敛则强制停止 设置了参数变化指标,如果一次迭代后参数没有改变,说明达到了收敛状态,可以停止了。 ![](https://i-blog.csdnimg.cn/blog_migrate/30e77713b72a65fe78a981b9837dbdca.png) (3)判断下标为i的α是否满足KKT条件 ![](https://i-blog.csdnimg.cn/blog_migrate/1b7fa44d90a908cea997729c9c580432.png) ![](https://i-blog.csdnimg.cn/blog_migrate/f2d95233615ac911b58b7e43b0229ddc.png) 这里需要计算gxi: 可以发现这里的g(xi)需要计算前面的求和式,但是在支持向量机中,a>0的样本点(xi,yi)实例才是支持向量,而非支持向量的ai*yi*K(xj,xi)是为0的。这样可以大大减少计算。 ![](https://i-blog.csdnimg.cn/blog_migrate/e803cee39b1958721bcc6eeab1930bad.png)
(4)如果不满足KKT条件就通过SMO算法进行优化。 SMO算法在每个子问题中选择两个变量优化,其中至少一个变量是违反KKT条件的。 SMO通过外层循环,在训练样本中选取违反KKT 条件最严重的样本点,并将其对应的变量作为第一个变量。第一个变量α的下标i已经确定。这里选择的是遇到的第一个违反KKT 条件的样本点。 接下来第二步选择变量2,通过内层循环,选择a2,使其对应|E1-E2|的值最大。由于变量2的选择中涉及到|E1 - E2|,因此先计算E1。 ![](https://i-blog.csdnimg.cn/blog_migrate/43e82cc0d6fb156c8e011b792771e5b0.png) 如果E1是正的,选择最小的Ei作为E2,反之选最大的Ei。 ![](https://i-blog.csdnimg.cn/blog_migrate/4066532da1650b93937126755adead60.png) ![](https://i-blog.csdnimg.cn/blog_migrate/1d30e4f23ef81a20061596bd049294dc.png) 这挑选E2的时候,进行了一次优化算法。在Ei的初始化中,由于所有α为0,所以一开始是设置Ei初始值为-yi。这里修改为与α一致,初始状态所有Ei为0,在运行过程中再逐步更新。当程序检测到并没有Ei为非0时,将会使用随机函数随机挑选一个,将减少一部分时间消耗。 | ![](https://i-blog.csdnimg.cn/blog_migrate/35004cc5a641298decffc02c1bf5200b.png) 依据标签是否一致来生成不同的L和H,如果两者相等,说明该变量无法再优化,直接跳到下一次循环,否则就计算a的新值 ![](https://i-blog.csdnimg.cn/blog_migrate/8eca2fd1dd3903d22edc1c630e2aabc2.png) ![](https://i-blog.csdnimg.cn/blog_migrate/b3dbae2b0febc03eb0491eeb7ee050d7.png) | 全部计算结束后,重新遍历一遍α,查找里面的支持向量 ![](https://i-blog.csdnimg.cn/blog_migrate/c3d0586ae45d1b2bb7fe2b61b47d5ab8.png) 3.进行预测 遍历所有支持向量,计算求和式,如果是非支持向量,求和子式必为0,没有必须进行计算 ![](https://i-blog.csdnimg.cn/blog_migrate/be4191b5ec94707a13aed66fa992df09.png) 4.进行测试 ![](https://i-blog.csdnimg.cn/blog_migrate/4e786a2199caaa9d442169b59448779c.png) ![](https://i-blog.csdnimg.cn/blog_migrate/73eedf4de7df43226aed8b56f547d627.png) ![](https://i-blog.csdnimg.cn/blog_migrate/7a4fb551be5d2e5814e602d7d92db770.png) |
|
可以发现这里的g(xi)需要计算前面的求和式,但是在支持向量机中,a>0的样本点(xi,yi)实例才是支持向量,而非支持向量的ai*yi*K(xj,xi)是为0的。这样可以大大减少计算。 |