【问题标题】:How to add L1 normalization in python?如何在python中添加L1规范化?
【发布时间】:2018-07-24 18:21:14
【问题描述】:

我正在尝试从头开始编写逻辑回归代码。在这段代码中,我认为我的成本导数是我的正则化,但我的任务是添加 L1norm 正则化。你如何在python中添加这个?是否应该在我定义了成本导数的地方添加它?感谢您在正确方向上的任何帮助。

def Sigmoid(z):
    return 1/(1 + np.exp(-z))

def Hypothesis(theta, X):   
    return Sigmoid(X @ theta)

def Cost_Function(X,Y,theta,m):
    hi = Hypothesis(theta, X)
    _y = Y.reshape(-1, 1)
    J = 1/float(m) * np.sum(-_y * np.log(hi) - (1-_y) * np.log(1-hi))
    return J

def Cost_Function_Derivative(X,Y,theta,m,alpha):
    hi = Hypothesis(theta,X)
    _y = Y.reshape(-1, 1)
    J = alpha/float(m) * X.T @ (hi - _y)
    return J

def Gradient_Descent(X,Y,theta,m,alpha):
    new_theta = theta - Cost_Function_Derivative(X,Y,theta,m,alpha)
    return new_theta

def Accuracy(theta):
    correct = 0
    length = len(X_test)
    prediction = (Hypothesis(theta, X_test) > 0.5) 
    _y = Y_test.reshape(-1, 1)
    correct = prediction == _y
    my_accuracy = (np.sum(correct) / length)*100
    print ('LR Accuracy: ', my_accuracy, "%")

def Logistic_Regression(X,Y,alpha,theta,num_iters):
    m = len(Y)
    for x in range(num_iters):
        new_theta = Gradient_Descent(X,Y,theta,m,alpha)
        theta = new_theta
        if x % 100 == 0:
            print #('theta: ', theta)    
            print #('cost: ', Cost_Function(X,Y,theta,m))
    Accuracy(theta)
ep = .012 
initial_theta = np.random.rand(X_train.shape[1],1) * 2 * ep - ep
alpha = 0.5
iterations = 10000
Logistic_Regression(X_train,Y_train,alpha,initial_theta,iterations)

【问题讨论】:

    标签: python machine-learning logistic-regression regularized


    【解决方案1】:

    正则化在成本函数中添加了一项,以便在最小化成本和最小化模型参数之间进行折衷以减少过度拟合。您可以通过为正则化项添加标量 e 来控制要折衷的程度。

    所以只需将 theta 的 L1 范数添加到原始成本函数中:

    J = J + e * np.sum(abs(theta))
    

    既然这一项是加到代价函数中的,那么在计算代价函数的梯度时就应该考虑到这一点。

    这很简单,因为和的导数是导数的和。所以现在只需要弄清楚sum(abs(theta))这个词的派生词是什么。因为它是一个线性项,所以导数是常数。如果 theta >= 0,则为 = 1,如果 theta

    所以在函数Cost_Function_Derivative中我们添加:

    J = J + alpha * e * (theta >= 0).astype(float)
    

    【讨论】:

    • 谢谢你,这给了我一个 e 未定义的错误。我是否在 Logistic_Regression 函数定义中定义了 e?
    • 是的,我应该提到e 是您需要使用交叉验证选择的参数。
    • 我已经完成了交叉验证,因此我需要缩放训练数据或其错误吗?
    • 交叉验证是为 e 设置最佳值。对于初学者,您可以将其设置为任何值(例如 0.1)来测试新代码...缩放数据应该对实现产生影响。
    猜你喜欢
    • 2010-09-12
    • 2017-07-30
    • 2021-09-18
    • 2014-05-26
    • 1970-01-01
    • 2018-08-19
    • 2021-05-05
    • 1970-01-01
    • 2014-07-13
    相关资源
    最近更新 更多