首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >logistic回归的Python正则化梯度下降

logistic回归的Python正则化梯度下降
EN

Stack Overflow用户
提问于 2018-02-26 17:00:50
回答 1查看 2.7K关注 0票数 2

我试图在Python3x中为logistic回归实现梯度下降(GD) (而不是随机下降)。还有一些麻烦。

Logistic回归定义如下(1):logistic回归公式

梯度公式定义如下(2):logistic回归的梯度下降

数据描述:

  • 对象的X是(Nx2)-matrix (由正浮点数和负浮点数组成)
  • 类标签(-1或+1)的(Nx1)-vector

任务:使用L2正则化实现梯度下降;2)没有正则化。期望的结果:权向量。参数:正则化率C=10用于正则回归,C=0用于非正则回归;梯度步长k=0.1;迭代max.number = 10000;公差= 1e-5。注:如果重量向量与当前步骤和先前步骤之间的距离小于容限(1e-5),则GD收敛。

这里是我的实现:k-梯度步骤;C-正则化率.

代码语言:javascript
复制
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

分别:

代码语言:javascript
复制
# call for UNregularized GD: C=0
w = GD(X, y, C=0., k=0.1) 

代码语言:javascript
复制
# call for regularized GD: C=10
w_reg = GD(X, y, C=10., k=0.1)

以下是结果(权重向量):

代码语言:javascript
复制
# UNregularized GD
[0.035736331265589463, 0.032464572442830832]

# regularized GD
[5.0979561973044096e-06, 4.6312243707352652e-06]

然而,它应该是(自我控制的正确答案):

代码语言:javascript
复制
# UNregularized GD
[0.28801877, 0.09179177]

# regularized GD
[0.02855938, 0.02478083]

,你能告诉我这里出了什么问题吗?我连着这个问题坐了三天,仍然不知道。

提前谢谢你。

EN

回答 1

Stack Overflow用户

发布于 2018-02-26 17:05:55

首先,乙状结肠函数应该是

代码语言:javascript
复制
def sigmoid(Z):
   A=1/(1+np.exp(-Z))
   return A

试着用这个公式再次运行它。那L是什么?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48993481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档