最近在学习SVM时,对于SMO代码(代码源自《机器学习实战》)中判断是否需要优化alpha[i]不太理解。
挣扎了一番,说说自己小小的见解。
也希望大神们能指导一下。
SMO是一种启发式同时优化两个alpha值的算法。
过程中会先选择一个alpha[i]先判断是否需要优化之然后再选择另外一个alpha[j]。
而判断的代码大概是这样的:
if ((labelMat[i] * Ei < -toler) and (alphas[i] < C)) or ((labelMat[i] * Ei > toler) and (alphas[i] > 0)):
# coding
判断条件翻译成公式就是:
两个条件能否成立一个,如果成立则说明alpha[i]是需要优化的。
在我的理解中对于SVM划分的区域可以看成三个个部分a区域,b区域,和作为支持向量的蓝线区域:
对应起来在a区域的点,其alpha值是等于C的。b区域的点alpha值为0。而恰好在蓝线上的点也就是支持向量,alpha>0。
那么对于一个点采用svm划分。它被划错就有两种情况:
1.该点属于b区域,其几何距离应该大于1,但是alpha>0,比如点p。
也就是公式中第一个判别条件。
2.该点属于a区域,其几何距离应该是c,但是alpha<c,不如点q。
公式中第二个判别条件。
对于这两种划错情况,其alpha值都是有必要优化的。所以也就有了代码中,对应的判断条件。
那么问题来了,有没有一种情况
发生呢。
因为这种情况下xi在支持向量上但是其对应的alpha是零。这也是错误的情况之一。
这个我还没想好怎么证明,以后我会补上来。还请大家多多指点额。