2017-03-20 32 views
0

我試圖採取此功能的梯度: 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 analyt:-0.72164669 -2.59980408]

當我犯了一個錯誤?

回答

1

您的分析梯度計算錯誤:

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))))))