def gradAscent(dataMat,classLabels):
dataMatrix = np.mat(dataMat)
labelMat = np.mat(classLabels).transpose()
m,n = np.shape(dataMatrix)
#100,3
alpha = 0.001
maxCycles = 500
#迭代停止条件这里是设置的迭代次数,也可以是梯度变化小于某个阈值
weights = np.ones((n,1))
for k in range(1):
h = sigmoid(dataMatrix*weights)
error = (labelMat - h)
weights = weights + alpha*(dataMatrix.transpose()*error)
return weights
weights = weights + alpha*(dataMatrix.transpose()*error) 这里是梯度上升法,文中说省去了简单的公式推导,我表示真不简单,以下做个解释:
梯度是一个矢量,有方向,有大小(向量的模,都是正数),一个弯曲的平面上的点想往下走有无数个方向可以选择(二维是没有方向的),而最陡峭的方向就是梯度的方向。
我们再寻求极小值时:
(可以用一元二次方程做类似想象,一元梯度等于导数,切线的斜率的绝对值为梯度大小)
当一个函数在随机点x求得的梯度为正数时,那么我们将x减小一点,函数值就会变小;
梯度为正时:x_new = x - alpha*梯度