【机器学习实战】logistic回归
Sigmoid函数
逻辑函数.png逻辑函数图像.png
作用:接受所有的输入然后预测出类别。进行分类时,我们在每个特征上都乘上一个回归系数,然后将所有的结果相加,作为输入参数z,带入Sigmoid函数得到一个范围在0~1之间的数值。任何大于0.5的被归入1类,否则归入0类。所以,logistic回归也可以看成是一种概率估计。
梯度上升法确定最优回归系数
sigmoid函数的输入记为z,即z=w0x0+w1x1+w2x2+...+wnxn,如果用向量表示即为z=wTx,它表示将这两个数值向量对应元素相乘然后累加起来。其中,向量x是分类器的输入数据,w即为我们要拟合的最佳参数。logistic回归最重要的是要找到最佳的拟合参数。
sigmoid梯度上升法,它的基本思想是:要找到某函数的最大值,最好的方法就是沿着该函数的梯度方向搜寻。如果函数为f,梯度记为D,a为步长,那么梯度上升法的迭代公式为:w:=w+a*Dwf(w)。该公式停止的条件是迭代次数达到某个指定值或者算法达到某个允许的误差范围。
sigmoid更新机制简单理解为:将对应权重的z带入Sigmoid函数,计算出结果(范围0~1),将该结果与样本已知的类别相减得到误差值,用每个样本对应的步长*系数*差值来更新原来的系数。
sigmoid
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
随机梯度上升
梯度上升法每次更新回归系数都需要遍历整个数据集,当样本数量较小时,该方法尚可,但是当样本数据集非常大且特征非常多时,那么随机梯度下降法的计算复杂度就会特别高。一种改进的方法是一次仅用一个样本点(随机选取样本最好,使用之后删掉该值)来更新回归系数,即随机梯度上升法。由于可以在新样本到来时对分类器进行增量式更新,因此随机梯度上升法是一个在线学习算法。
改进:将alpha在每次迭代中进行调整,alpha=4/(1.0+i+j)+0.01,其中i样本点的下标,j是迭代次数,当j<<max(i)时,alpha并不是严格下降。避免参数的严格下降常见于优化算法中。随机选取样本解决了周期波动的问题,调整alpha