我正在尝试为 Python 3x 中的逻辑回归实现梯度下降(GD)(不是随机的)。并且有一些麻烦。
逻辑回归定义如下(1): 逻辑回归公式
梯度的公式定义如下(2): 逻辑回归的梯度下降
数据说明:
- X 是 (Nx2) - 对象矩阵(由正负浮点数组成)
- y 是 (Nx1)-类标签的向量(-1 或 +1)
任务: 使用 L2 正则化实现梯度下降 1);2)没有正则化。期望的结果:权重向量。参数:正则化率C =10,正则化回归,C=0,非正则化回归;梯度步长k =0.1;最大迭代次数 = 10000;容差 = 1e-5。注意:如果当前步骤和之前步骤的权重向量之间的距离小于容差 (1e-5),则 GD 会收敛。
这是我的实现: k - 梯度步骤; C - 正则化率。
import numpy as np
def sigmoid(z):
result = 1./(1. + np.exp(-z))
return result
def distance(vector1, vector2):
vector1 = np.array(vector1, dtype='f')
vector2 = np.array(vector2, dtype='f')
return np.linalg.norm(vector1-vector2)
def GD(X, y, C, k=0.1, tolerance=1e-5, max_iter=10000):
X = np.matrix(X)
y = np.matrix(y)
l=len(X)
w1, w2 = 0., 0. # weights (look formula (2) in the beginning of question)
difference = 1.
iteration = 1
while(difference > tolerance):
hypothesis = y*(X*np.matrix([w1, w2]).T)
w1_updated = w1 + (k/l)*np.sum(y*X[:,0]*(1.-(sigmoid(hypothesis)))) - k*C*w1
w2_updated = w2 + (k/l)*np.sum(y*X[:,1]*(1.-(sigmoid(hypothesis)))) - k*C*w2
difference = distance([w1, w2], [w1_updated, w2_updated])
w1, w2 = w1_updated, w2_updated
if(iteration >= max_iter):
break;
iteration = iteration + 1
return [w1_updated, w2_updated] #vector of weights
分别:
# call for UNregularized GD: C=0
w = GD(X, y, C=0., k=0.1)
和
# call for regularized GD: C=10
w_reg = GD(X, y, C=10., k=0.1)
这是结果(权重向量):
# UNregularized GD
[0.035736331265589463, 0.032464572442830832]
# regularized GD
[5.0979561973044096e-06, 4.6312243707352652e-06]
但是,它应该是(自我控制的正确答案):
# UNregularized GD
[0.28801877, 0.09179177]
# regularized GD
[0.02855938, 0.02478083]
!!!拜托,你能告诉我这里出了什么问题吗?我连续三天坐在这个问题上,仍然不知道。
先感谢您。