逻辑回归的梯度有什么问题?
What is wrong with a gradient for logistic regression?
我正在尝试对这个函数进行渐变:
loss function
(N - 对象,m - 特征)。
def L(y,X,w): #loss function
return np.sum( np.log1p(np.exp(np.dot(w,(-X.T*y)))) )
这是我计算的偏导数:analytic gradient
def g(y,X,w): #gradient
return (-X.T*y).dot(1-1/(1+(np.exp(np.dot(w,(-X.T*y))))))
当我对梯度进行数值估计时,它的值不同于解析值,所以我可能做错了计算。
梯度检查:
e = 1e-4
test =(np.array([0.6, -0.2]), #y
np.array([[3,8.5], [1,-5]]), #X
np.array([-1,0.4])) #w
grd = np.ones((ss[1].shape[1],))
loss1 = L(test[0],test[1],test[2][0]-e)
loss2 = L(test[0],test[1],test[2][0]+e)
grd[0] = (loss2-loss1)/(2*e);
loss1 = L(test[0],test[1],test[2][1]-e)
loss2 = L(test[0],test[1],test[2][1]+e)
grd[1] = (loss2-loss1)/(2*e);
print('\ngrd num: ',grd)
print('\ngrd analyt: ',g(test[0],test[1],test[2]))
grd 编号:[-7.25478847 -1.47346219]
grd 分析:[-0.72164669 -2.59980408]
我哪里弄错了?
你的解析梯度计算有误:
def g(y,X,w): #gradient
return (-X.T * y).dot(1 - 1 / (1 + (np.exp(np.dot(w,(-X.T * y))))))
右边是一个:
def g(y,X,w):
return (-X.T * y).dot(1 / (1 + (np.exp(np.dot(w,(X.T * y))))))
我正在尝试对这个函数进行渐变: loss function (N - 对象,m - 特征)。
def L(y,X,w): #loss function
return np.sum( np.log1p(np.exp(np.dot(w,(-X.T*y)))) )
这是我计算的偏导数:analytic gradient
def g(y,X,w): #gradient
return (-X.T*y).dot(1-1/(1+(np.exp(np.dot(w,(-X.T*y))))))
当我对梯度进行数值估计时,它的值不同于解析值,所以我可能做错了计算。
梯度检查:
e = 1e-4
test =(np.array([0.6, -0.2]), #y
np.array([[3,8.5], [1,-5]]), #X
np.array([-1,0.4])) #w
grd = np.ones((ss[1].shape[1],))
loss1 = L(test[0],test[1],test[2][0]-e)
loss2 = L(test[0],test[1],test[2][0]+e)
grd[0] = (loss2-loss1)/(2*e);
loss1 = L(test[0],test[1],test[2][1]-e)
loss2 = L(test[0],test[1],test[2][1]+e)
grd[1] = (loss2-loss1)/(2*e);
print('\ngrd num: ',grd)
print('\ngrd analyt: ',g(test[0],test[1],test[2]))
grd 编号:[-7.25478847 -1.47346219]
grd 分析:[-0.72164669 -2.59980408]
我哪里弄错了?
你的解析梯度计算有误:
def g(y,X,w): #gradient
return (-X.T * y).dot(1 - 1 / (1 + (np.exp(np.dot(w,(-X.T * y))))))
右边是一个:
def g(y,X,w):
return (-X.T * y).dot(1 / (1 + (np.exp(np.dot(w,(X.T * y))))))