【机器学习】求解逻辑回归参数(梯度上升算法和牛顿法)

回顾

这篇博客【链接】我们简单介绍了逻辑回归模型,留下了一个问题:怎么求解使 J ( θ ) 最大的 θ 值呢?

J ( θ ) = i = 1 m ( y ( i ) l o g h θ ( x ( i ) ) + ( 1 y ( i ) ) l o g ( 1 h θ ( x ( i ) ) ) )

前面我们提到了用梯度上升法和牛顿法。那么什么是梯度上升法和牛顿法呢?

梯度上升算法

由于 J ( θ ) 过于复杂,我们从一个简单的函数求极大值说起。
一元二次函数

f ( x ) = x 2 + 4 x

图像如下:
这里写图片描述

根据高中所学知识:
1. 求极值,先求函数的导数

f ( x ) = 2 x + 4

2. 令导数为0,可求出 x = 2 即取得函数 f ( x ) 的极大值。极大值等于 f ( 2 ) = 4

但是真实环境中的函数不会像上面这么简单,就算求出了函数的导数,也很难精确计算出函数的极值。此时我们就可以用迭代的方法来做。就像爬坡一样,一点一点逼近极值。这种寻找最佳拟合参数的方法,就是最优化算法。爬坡这个动作用数学公式表达即为:

x i + 1 = x i + α f ( x i ) x i

其中, α 为步长,也就是学习速率,控制更新的幅度。效果如下图:
这里写图片描述

比如从(0,0)开始,迭代路径就是1->2->3->4->…->n,直到求出的x为函数极大值的近似值,停止迭代。
这一过程,就是梯度上升算法。那么同理, J ( θ ) 这个函数的极值,也可以这么求解。公式可以写为:

θ j := θ j + α J ( θ ) θ j

那么,我们现在只要求出 J ( θ ) 的偏导,就可以利用梯度上升算法求解 J ( θ ) 的极大值了。

J ( θ ) = i = 1 m { y ( i ) l o g h θ ( x ( i ) ) + ( 1 y ( i ) ) l o g ( 1 h θ ( x ( i ) ) ) }

h θ ( x ) = g ( θ T x ) = 1 1 + e θ T x

令:
g ( z ) = 1 1 + e z

求导:
g ( z ) = e z ( 1 + e z ) 2 = 1 1 + e z e z 1 + e z = 1 1 + e z ( 1 1 1 + e z ) = g ( z ) ( 1 g ( z ) )

可得:
g ( θ T x ) = g ( θ T x ) ( 1 g ( θ T x ) )

J ( θ )

J ( θ ) θ j = i = 1 m ( y ( i ) h θ ( x ( i ) ) 1 y ( i ) 1 h θ ( x ( i ) ) ) h θ ( x ( i ) ) θ j

= i = 1 m ( y ( i ) g ( θ T x ( i ) ) 1 y ( i ) 1 g ( θ T x ( i ) ) ) g ( θ T x ( i ) ) θ j

= i = 1 m ( y ( i ) g ( θ T x ( i ) ) 1 y ( i ) 1 g ( θ T x ( i ) ) ) g ( θ T x ( i ) ) ( 1 g ( θ T x ( i ) ) ) θ T x ( i ) θ j

其中:
θ T x ( i ) θ j = ( θ 1 x 1 ( i ) + θ 2 x 2 ( i ) + θ 3 x 3 ( i ) + . . . + θ n x n ( i ) ) θ j = x j ( i )

= i = 1 m { y ( i ) ( 1 g ( θ T x ( i ) ) ) ( 1 y ( i ) ) ( g ( θ T x ( i ) ) } x j ( i ) = i = 1 m ( y ( i ) g ( θ T x ( i ) ) ) x j ( i )

综上:

θ j := θ j + α i = 1 m ( y ( i ) h θ ( x ( i ) ) ) x j ( i )

θ j := θ j + α ( y ( i ) h θ ( x ( i ) ) ) x j ( i )

牛顿法

同样,我们先来看个简单的例子。求函数值为0时的x的值。
用牛顿法迭代公式:

x n + 1 = x n f ( x n ) f ( x n ) x n + 2 = x n + 1 f ( x n + 1 ) f ( x n + 1 )

这里写图片描述

这个迭代 公式的意思就是:在 x = x 1 时,求得 ( x 1 , f ( x 1 ) ) 的切线与x轴的交点为 x 2 ,再求 ( x 2 , f ( x 2 ) ) 的切线与x轴的交点 x 3 ,依次迭代,直到找到满足要求的点。

然而,对于 J ( θ ) 我们需要求得一阶导数为0的点,那么牛顿法迭代公式可以更新为:

x n + 1 = x n J ( x n ) J ( x n ) x n + 2 = x n + 1 J ( x n + 1 ) J ( x n + 1 )

拓展

在多元的情况下, J ( x n ) = H ( θ ^ ) 海塞矩阵

H ( θ ^ ) = [ 2 J θ 1 θ 1 2 J θ 1 θ 2 2 J θ 2 θ 1 2 J θ 2 θ 2 ]

三阶海塞矩阵形式为:

H ( θ ^ ) = [ 2 J θ 1 θ 1 2 J θ 1 θ 2 2 J θ 1 θ 3 2 J θ 2 θ 1 2 J θ 2 θ 2 2 J θ 2 θ 3 2 J θ 3 θ 1 2 J θ 3 θ 2 2 J θ 3 θ 3 ]

H ( θ ^ ) = [ i = 1 n h θ ( x i ) ( 1 h θ ( x i ) ) x i , 1 x i , 1 ,   i = 1 n h θ ( x i ) ( 1 h θ ( x i ) ) x i , 1 x i , 2 ,   i = 1 n h θ ( x i ) ( 1 h θ ( x i ) ) x i , 1 i = 1 n h θ ( x i ) ( 1 h θ ( x i ) ) x i , 2 x i , 1 ,   i = 1 n h θ ( x i ) ( 1 h θ ( x i ) ) x i , 2 x i , 2 ,   i = 1 n h θ ( x i ) ( 1 h θ ( x i ) ) x i , 2 , i = 1 n h θ ( x i ) ( 1 h θ ( x i ) ) x i , 1 ,   i = 1 n h θ ( x i ) ( 1 h θ ( x i ) ) x i , 2 ,   i = 1 n h θ ( x i ) ( 1 h θ ( x i ) ) ] h θ ( x i ) = 1 1 + e z z = θ 1 x i , 1 + θ 2 x i , 2 + θ 3

一阶导数

J = i = 1 n ( y i h θ ( x i ) ) x i , 1 i = 1 n ( y i h θ ( x i ) ) x i , 2 i = 1 n ( y i h θ ( x i ) )

注:
此外,还可以用sklearn自带函数求解逻辑回归参数
此三种方法的python3代码实现,点击这里,对比本文公式看

猜你喜欢

转载自blog.csdn.net/daycym/article/details/80472015