Logistic回归之梯度上升优化算法
一、Logistic回归
首先我们需要了解什么是Logistic回归。Logistic回归是一种分类算法,一般用于二分类问题,例如预测明天是否下雨,当然也可以用于多分类问题。本文主要是讨论二分类问题。二分类问题即输出结果一般只有两个情况,我们可以理解为函数的输出为0或1。具有这种性质的函数我们已经接触过,该函数成为海微塞德阶跃函数(Heaviside step function),或者直接称为单位阶跃函数。然而该函数在跳跃点上从0瞬间跳跃到1,这个瞬间跳跃过程很难处理。所以使用Sigmoid函数,Sigmoid函数计算公式如下:
Z是函数的输入,将两个数值向量对应元素相乘然后全部加起来得到z值。向量x是分类器的输入数据,向量w也就是我们要找到的最佳参数(系数),从而使得分类器尽可能精确。图中上部分是没有w的的输入,图中下部分是有w的输入。使得Sigmoid函数看起来像一个阶跃函数。
二、梯度上升法
为了寻找最佳参数w,需要用到最优化理论的一些知识。首先介绍梯度上升的最优化方法。梯度上升法基于的思想是:要找到某函数的最大值,最好的方法是沿着该函数的梯度方向探寻。如果梯度记为,则函数d的梯度由下表示:
这个梯度意味着要沿x的方向移动,沿y方向移动。其中,函数f(x,y)必须要在待计算的点上有定义并且可微。其实和我们高中求导求极值是一个意思。梯度算法的迭代公式如下:
其中为步长,也就是学习速率,控制更新的幅度。我们以函数为例。比如从(0,0)开始,迭代路径就是1→2→3→4→...→n,直到求出的x为函数极大值的近似值,停止迭代,python3代码如下:
'''
函数说明:梯度上升算法测试函数
求函数f(x) = -x^2 + 4x的极大值
Parameters:
无
Returens:
无
'''
def Gradient_Ascent_test():
def f_prime(x_old):
return -2 * x_old +4 #f(x)的导数
x_old = -1 #初始值,给一个小鱼x_new的值
x_new = 0 #梯度上升算法初始值,即从(0,0)开始
alpha = 0.01 #步长,也就是学习速率,控制更新的幅度
presision = 0.00000001 #精度,也就是更新阈值
while abs(x_old - x_new) >presision:
x_old = x_new
x_new = x_old + alpha * f_prime(x_old) #上面提到的公式
print(x_new) #打印最终求解的x
if __name__ == '__main__':
Gradient_Ascent_test()