大家好,我是Mac Jiang,今天和大家分享Coursera---台湾大学---機器學習基石 (Machine Learning Foundations)---作业1:Q18-20的C++实现。虽然我的代码得到了较为正确的结果,但是肯定不是最好的,如果各位博友有更好的实现思路,请留言指正,谢谢!希望我的博客能给您带来一些学习上的帮助!Q15-17的实现过程已经在:http://blog.csdn.net/a1015553840/article/details/50979434中给出,有需要的博友可以前往阅读。
其他解答看汇总帖:http://blog.csdn.net/a1015553840/article/details/51085129
虽然已经有很多博友给出了这个算法的Phython实现过程,说实话,利用Phython的实现比C++来的简答,但是不是每位博友都会Phython,所以在这里提供C++的实现过程,以备各位博友的不时之需!
好的,话不多说。这次主要任务是实现PLA的pocket过程,前面博客提到,当训练样本是线性可分的,我们用PLA可以很快的实现样本的分类。但是如果样本不是线性可分的,那么我们就需要对PLA进行改进。这里采用的是贪心算法,他的思想是把当前最好的分类线保存在口袋中,然后对曲线进行修正得到新的线。如果得到新的线对训练样本的错误率更小,那么我们把这条线保存下来。继续运行程序,直到达到足够的迭代次数。
0.初始化口袋曲线w
{
1.寻找分类错误点(x,y)
2.修正错误:w(t+1) = w(t) + y*x
3.如果w(t+1)对训练样本的错误率比口袋里的w更小,则用w(t+1)替代w
}until(达到足够的迭代次数)
如果知道训练样本D是线性可分的,则运行PLA比较好ÿ