以下是重构的内容:
机器学习领域的一个重要问题是如何优化算法的设计。本文主要介绍了SVM的优化方法,重点实现了Platt SMO算法以及使用遗传算法框架GAFT对初始SVM进行优化。文章首先介绍了SMO算法中的启发式选择变量方法,以提高优化效率。接下来,针对第一个α1和第二个α2,Platt SMO采取了不同的启发式手段。在第一个变量的选择过程中,我们在整个样本集和非边界样本集间进行交替遍历。为了能够快速选取有最大步长的α,我们需要对所有数据对应的误差进行缓存,因此特地写了个SVMUtil类来保存svm中重要的变量以及一些辅助方法。在第二个变量的选择过程中,我们希望选取的第二个变量α2优化后能有较大的变化。根据之前推导的式子,新的α2的变化依赖于|E1−E2|。有时候按照上述的启发式方式仍不能够使函数值有足够的下降,这是按下述步骤进行选择:在非边界数据集上选择能够使函数值足够下降的样本作为第二个变量。
希望这能帮到你。如果你有其他问题,请随时问我。
如果非边界数据集上没有,则在整个数据仅上进行第二个变量的选择。如果仍然没有则重新选择第一个α1。
第二个变量选取的Python实现:KKT条件允许一定的误差。在Platt论文中的KKT条件的判断中有一个tolerance允许一定的误差,相应的Python实现可以参考:https://github.com/PytLab/MLBox/blob/master/svm/svm_platt_smo.py。针对之前的数据集我们使用Platt SMO进行优化可以得到。
将分割线和支持向量可视化:可见通过Platt SMO优化出来的支持向量与简化版的SMO算法有些许不同。
使用遗传算法优化SVM:由于最近自己写了个遗传算法框架,遗传算法作为一个启发式无导型的搜索算法非常易用,于是我就尝试使用遗传算法来优化SVM。使用遗传算法优化,我们就可以直接优化SVM的最初形式了也就是最直观的形式。顺便再安利下自己的遗传算法框架,在此框架的帮助下,优化SVM算法我们只需要写几十行的Python代码即可。其中最主要的就是编写适应度函数,根据上面的公式我们需要计算数据集中每个点到分割线的距离并返回最小的距离即可,然后放到遗传算法中进行进化迭代。遗传算法框架GAFT项目地址: https://github.com/PytLab/gaft ,使用方法详见README。
Ok,我们开始构建种群用于进化迭代。创建个体与种群:对于二维数据点,我们需要优化的参数只有三个也就是[w1,w2]和b,个体的定义如下:种群大小这里取600,创建种群。创建遗传算子和GA引擎:这里没有什么特别的,直接使用框架中内置的算子就好了。适应度函数:这一部分只要把上面svm初始形式描述出来就好了,只需要三行代码。开始迭代:这里迭代300代种群。绘制遗传算法优化的分割线:得到的分割曲线如下图所示。