逻辑回归中的输入和输出是非线性关系,这样可以把输出限定在某一范围内。一个常用的逻辑回归函数为Sigmoid函数
Sigmoid函数
Sigmoid函数表达式为
其形状如下:
可以看出,对于给定的任何输入,其输出范围为(0, 1)。Sigmoid可以用于分类。给出一个阈值
η
,当输出大于
η
时,归类为1;当输出小于
η
时,归类为0。
梯度下降法
在求解优化问题时,常常难求闭式解。这时可以采用梯度下降法逼近最优解。在一个多参数(x_1,x_2,…,x_n)优化问题中,对某一参数x求梯度,梯度方向就是x增长最快的方向,梯度反方向就是x下降最快的方向。假设求解最小值(如果是凸优化),一直沿着梯度反方向,则可以找到其最优点;即使是非凸优化问题,梯度下降也有着很好的表现。
写成向量为
如果目标函数为 f(x) ,那么梯度下降法更新函数为
wn=wn+α▽wnf(W)
上面这个公式可以一直迭代,直到达到某个终止条件。其中
α
为步长。
下面看一段《机器学习实战》中梯度更新的Python代码
def gradAscent(dataMatIn, classLabels):
dataMatrix = mat(dataMatIn) #convert to NumPy matrix
labelMat = mat(classLabels).transpose() #convert to NumPy matrix
m,n = shape(dataMatrix)
alpha = 0.001
maxCycles = 500
weights = ones((n,1))
for k in range(maxCycles): #heavy on matrix operations
h = sigmoid(dataMatrix*weights) #matrix mult
error = (labelMat - h) #vector subtraction
weights = weights + alpha * dataMatrix.transpose()* error #matrix mult
return weights
输入dataMatIn
表示权重矩阵,每一行都是一组权重系数;classLabels
表示目标值,是个列向量。上面函数先把输入转换为NumPy数据。maxCycles表示迭代500次终止,alpha表示步长,weights初始化为n行1列的向量,值为1。
在for循环中,首先计算函数f(这里为sigmoid函数)的输出h,计算期望值(labelMat)和输出值h的误差error;这里dataMatrix.transpose()
相当于梯度了。上面的代码看似简单,其实乘法使用了矩阵相乘。
随机梯度下降
梯度下降法,在每一步更新梯度时都要遍历所有数据集。如果数据集中数据量大,那么计算复杂度会太高。这时可以考虑随机梯度下降。随机梯度下降,在每次更新权重时,只使用一个样本,遍历所有样本来更新数据。
在数学上可以这样理解:梯度下降法中,使用所有数据量的梯度是函数f下降最快的方向;随机梯度下降法中,虽然梯度的方向不是函数下降最快的,但是也是下降的方向。
可以给出Python代码比较
def stocGradAscent0(dataMatrix, classLabels):
m,n = shape(dataMatrix)
alpha = 0.01
weights = ones(n) #initialize to all ones
for i in range(m):
h = sigmoid(sum(dataMatrix[i]*weights))
error = classLabels[i] - h
weights = weights + alpha * error * dataMatrix[i]
return weights
这个函数的输入和前面相同,但是这里面没有矩阵相乘了,每次使用一个数据(即一行数据)。
批梯度下降
随机梯度下降中,每次只使用一组数据,梯度下降则使用全部数据;一个折中的方法是使用部分数据,即批梯度下降法。
批梯度下降法中,可以随机/顺序从训练集中取N组数据,使用这N组数据来更新步长。