【问题标题】:SGD Classifier with Logloss and L2 regularization Using SGD without using sklearn python具有 Logloss 和 L2 正则化的 SGD 分类器 在不使用 sklearn python 的情况下使用 SGD
【发布时间】:2020-06-08 07:31:52
【问题描述】:

我正在使用 python 解决 SGD 手动实现的分配问题。我被困在 dw 导数函数上。

import numpy as np 
import pandas as pd 
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=50000, n_features=15, n_informative=10, n_redundant
=5,n_classes=2, weights=[0.7], class_sep=0.7, random_state=15)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=15)

def initialize_weights(dim):
    w=np.zeros_like(dim)
    b=0
    return w,b
dim=X_train[0] 
w,b = initialize_weights(dim)
print('w =',(w))
print('b =',str(b))

import math
def sigmoid(z):
''' In this function, we will return sigmoid of z'''
# compute sigmoid(z) and return
    test_neg_int = -z
    sig_z=1/(1+(math.exp(test_neg_int )))

    return sig_z

import math
def logloss(y_true,y_pred):
'''In this function, we will compute log loss '''
    n=len(y_true)
    loss= -(1.0/n)*sum([y_true[i]*math.log(y_pred[i],10)+ (1.0-y_true[i])*math.log(1.0-y_pred[i],10) 
    for i in range(len(y_true))])
    return loss

def gradient_dw(x,y,w,b,alpha,N):
'''In this function, we will compute the gardient w.r.to w '''
    for n in range(0,len(x)):
        dw=[] 
 # y=0, x= 15 array values, w= 15 array values of 0, b=0, alpha=0.0001, n=len(X_train)=37500
        lambda_val = 0.01
        d = x[n]*((y-alpha*((w.T)*x[n]+b)) - ((lambda_val*w)/N))
        dw.append(d)
    print (dw)

def grader_dw(x,y,w,b,alpha,N):
    grad_dw=gradient_dw(x,y,w,b,alpha,N)
    assert(np.sum(grad_dw)==2.613689585)
    return True
grad_x=np.array([-2.07864835,  3.31604252, -0.79104357, -3.87045546, -1.14783286,
   -2.81434437, -0.86771071, -0.04073287,  0.84827878,  1.99451725,
    3.67152472,  0.01451875,  2.01062888,  0.07373904, -5.54586092])
grad_y=0
grad_w,grad_b=initialize_weights(grad_x)
alpha=0.0001
N=len(X_train)
grader_dw(grad_x,grad_y,grad_w,grad_b,alpha,N)

我得到的结果

[array([-0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0.,
     -0., -0.])]
  ---------------------------------------------------------------------------
 AssertionError                            Traceback (most recent call last)
<ipython-input-168-a3ed60706dc2> in <module>
     10 alpha=0.0001
     11 N=len(X_train)
---> 12 grader_dw(grad_x,grad_y,grad_w,grad_b,alpha,N)

<ipython-input-168-a3ed60706dc2> in grader_dw(x, y, w, b, alpha, N)
      1 def grader_dw(x,y,w,b,alpha,N):
      2     grad_dw=gradient_dw(x,y,w,b,alpha,N)
----> 3     assert(np.sum(grad_dw)==2.613689585)
      4     return True
      5 grad_x=np.array([-2.07864835,  3.31604252, -0.79104357, -3.87045546, -1.14783286,

AssertionError: 

预期结果:

True

能否请您告诉我我对 gradient_dw 函数的理解是否有误?我正在尝试应用这个公式:

dw(t) = xn * (yn − σ * (((w(t))Transpose) * xn + b(t))) − (λ * w(t)) / N)

我正在尝试在 gradient_dw 函数中计算梯度 w.r.t 'w',以便稍后在主代码中使用它。我不明白的是w是一个0s的数组并且y=0,所以当我们应用dw(t)公式并返回dw时,我们很可能会得到一个0s的数组,但是为什么它说 “断言(np.sum(grad_dw)==2.613689585)”。我们怎么可能得到 2.613689585?

【问题讨论】:

    标签: python machine-learning artificial-intelligence gradient-descent sgd


    【解决方案1】:

    试试这个:

    try:
       assert()
    except AssertionError:
       return True
    

    【讨论】:

      【解决方案2】:

      你这里走错了

      1. 在迭代时,我们在随机梯度下降中迭代“n”个点(因为批量大小为 1),而不是“d”维。在这里,您正在迭代“d”维度。

      2. grad_x=np.array([-2.07864835, 3.31604252, -0.79104357, -3.87045546, -1.14783286, -2.81434437,-0.86771071,-0.04073287,0.84827878,1.99451725, 3.67152472, 0.01451875, 2.01062888, 0.07373904, -5.54586092])

      它是一个 15 维的单点。 因此,如下所示修改您的查询。它会起作用的。

          def gradient_dw(x,y,w,b,alpha,N):
             '''In this function, we will compute the gardient w.r.to w '''
             dw=x * (y-sigmoid(np.dot(w.T,x)+b)) -(alpha * w)/N
      
             return dw
      

      【讨论】:

        【解决方案3】:
        def gradient_dw(x,y,w,b,alpha,N):
        
           dw=(x*(y-sigmoid((w.T)*x+b)-(alpha/N)*w))
           return dw 
        

        【讨论】:

        • 虽然这段代码可以回答这个问题,但最好包含一些上下文,解释它是如何工作的以及何时使用它。从长远来看,纯代码的答案没有用处。
        • @7uc1f3r 很抱歉给您带来不便。问题是如何在不使用任何库的情况下制作 SGD 分类器。此代码计算梯度。
        • 我在问题的任何地方都没有看到
        【解决方案4】:

        这是解决方案:

        def gradient_dw(x,y,w,b,alpha,N):
        
            dw =x*(y-sigmoid(np.dot(w,x+b))) - ((alpha*w)/N)
            return dw
        

        【讨论】:

        猜你喜欢
        • 2021-08-12
        • 2020-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-09
        • 1970-01-01
        • 2014-05-06
        相关资源
        最近更新 更多