Python向量函数表示的简单介绍( 三 )


最里面语句的意思是固定除αi之外的所有αj(i不等于j),这时W可看作只是关于αi的函数 , 那么直接对αi求导优化即可 。这里我们进行最大化求导的顺序i是从1到m , 可以通过更改优化顺序来使W能够更快地增加并收敛 。如果W在内循环中能够很快地达到最优,那么坐标上升法会是一个很高效的求极值方法 。
用个二维的例子来说明下坐标下降法:我们需要寻找f(x,y)=x2+xy+y2的最小值处的(x*, y*) , 也就是下图的F*点的地方 。
【Python向量函数表示的简单介绍】假设我们初始的点是A(图是函数投影到xoy平面的等高线图,颜色越深值越?。?,我们需要达到F*的地方 。那最快的方法就是图中黄色线的路径,一次性就到达了 , 其实这个是牛顿优化法,但如果是高维的话,这个方法就不太高效了(因为需要求解矩阵的逆,这个不在这里讨论) 。我们也可以按照红色所指示的路径来走 。从A开始 , 先固定x , 沿着y轴往让f(x, y)值减小的方向走到B点 , 然后固定y , 沿着x轴往让f(x, y)值减小的方向走到C点,不断循环,直到到达F* 。反正每次只要我们都往让f(x, y)值小的地方走就行了,这样脚踏实地,一步步走,每一步都使f(x, y)慢慢变小,总有一天,皇天不负有心人的 。到达F*也是时间问题 。到这里你可能会说,这红色线比黄色线贫富差距也太严重了吧 。因为这里是二维的简单的情况嘛 。如果是高维的情况,而且目标函数很复杂的话,再加上样本集很多,那么在梯度下降中,目标函数对所有αi求梯度或者在牛顿法中对矩阵求逆,都是很耗时的 。这时候,如果W只对单个αi优化很快的时候 , 坐标下降法可能会更加高效 。
8.2、SMO算法
SMO算法的思想和坐标下降法的思想差不多 。唯一不同的是 , SMO是一次迭代优化两个α而不是一个 。为什么要优化两个呢?
我们回到这个优化问题 。我们可以看到这个优化问题存在着一个约束,也就是
假设我们首先固定除α1以外的所有参数 , 然后在α1上求极值 。但需要注意的是 , 因为如果固定α1以外的所有参数,由上面这个约束条件可以知道,α1将不再是变量(可以由其他值推出),因为问题中规定了:
因此,我们需要一次选取两个参数做优化,比如αi和αj , 此时αi可以由αj和其他参数表示出来 。这样回代入W中 , W就只是关于αj的函数了,这时候就可以只对αj进行优化了 。在这里就是对αj进行求导,令导数为0就可以解出这个时候最优的αj了 。然后也可以得到αi 。这就是一次的迭代过程,一次迭代只调整两个拉格朗日乘子αi和αj 。SMO之所以高效就是因为在固定其他参数后,对一个参数优化过程很高效(对一个参数的优化可以通过解析求解,而不是迭代 。虽然对一个参数的一次最小优化不可能保证其结果就是所优化的拉格朗日乘子的最终结果,但会使目标函数向极小值迈进一步,这样对所有的乘子做最小优化,直到所有满足KKT条件时,目标函数达到最?。?。
总结下来是:
重复下面过程直到收敛{
(1)选择两个拉格朗日乘子αi和αj;
(2)固定其他拉格朗日乘子αk(k不等于i和j),只对αi和αj优化w(α);
(3)根据优化后的αi和αj,更新截距b的值;
}
python中ge=num_x0010_是什么意思将ge定义为数组 。
num就是函数numpy的缩写,numpy提供一个具有向量算术运算和复杂广播能力的多维数组对象,用于对数组数据进行快速运算的标准数学函数 。
numpy可以进行非常有用的线性代数,傅里叶变换和随机数操作 。

推荐阅读