【问题标题】:Python regularized gradient descent for logistic regression用于逻辑回归的 Python 正则化梯度下降
【发布时间】:2018-02-26 17:00:50
【问题描述】:

我正在尝试为 Python 3x 中的逻辑回归实现梯度下降 (GD)(不是随机的)。还有一些麻烦。

逻辑回归定义如下(1): logistic regression formula

梯度公式定义如下(2): gradient descent for logistic regression

数据说明:

  • 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]

!!! 请告诉我这里出了什么问题?我连续三天坐在这个问题上,仍然不知道。

提前谢谢你。

【问题讨论】:

    标签: python numpy logistic-regression gradient-descent regularized


    【解决方案1】:

    首先,sigmoid函数应该是

    def sigmoid(Z):
       A=1/(1+np.exp(-Z))
       return A
    

    尝试使用此公式再次运行它。那么,L是什么?

    【讨论】:

    • 是的,没错,我修复了 sigmoid,但不幸的是,它没有任何区别,因为我之前使用了 1./sigmoid,所以结果公式没有改变。
    • 我还修复了 L 的问题(这只是为了更好地理解代码 - 事实上,它是公式 (2) 的一部分)。
    • 请记住,您提供的正确结果不会显示小于容差 1e-5 的差异,而您获得的结果更接近 t>d
    猜你喜欢
    • 2021-12-22
    • 2020-05-01
    • 2015-07-15
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 2014-08-26
    相关资源
    最近更新 更多