【问题标题】:gradient for fmin_tnc not workingfmin_tnc 的渐变不起作用
【发布时间】:2018-12-12 21:16:30
【问题描述】:

我正在训练手写识别的多类逻辑回归。对于函数最小化,我正在使用 fmin_tnc。 我已经实现了渐变功能如下:

    def gradient(theta,*args):
        X,y,lamda = args;
        m = np.size(X,0);
        h = X.dot(theta);
        grad = (1/m) * X.T.dot(  sigmoid(h)-y );
        grad[1:np.size(grad),] = grad[1:np.size(grad),] + (lamda/
                        m)*theta[1:np.size(theta),] ;
    return grad.flatten() 
#flattened because  fmin_tnc accepts list of gradients

这会为下面提供的小集合示例生成正确的梯度值:

  theta_t = np.array([[-2],[-1],[1],[2]]);
  X_t = np.array([[1,0.1,0.6,1.1],[1,0.2,0.7,1.2],[1,0.3,0.8,1.3], 
      [1,0.4,0.9,1.4],[1,0.5,1,1.5]])
  y_t = np.array([[1],[0],[1],[0],[1]])
  lamda_t = 3

但是当使用 scipy 的 checkgrad 函数时,它给出的错误是 0.6222474393497573 我无法追踪为什么会发生这种情况。因为这可能是 fmin_tnc 没有执行任何优化,并且总是给出与给定初始参数相等的优化参数。

【问题讨论】:

    标签: python-3.x numpy machine-learning scipy logistic-regression


    【解决方案1】:

    fmin_tnc 函数调用如下:

        optimize.fmin_tnc(func=lrcostfunction, x0=initial_theta,fprime = gradient,args= 
       (X,tmp_y.flatten(),lamda))
    

    由于 y 和 theta 传递的形式是大小为 (n,) 的一维数组,因此应将其转换为大小为 (n,1) 的二维数组。这是因为二维数组形式用于梯度功能实现。 正确的实现如下:

         def gradient(theta,*args):
             #again y and theta reshaped for same reason 
             X,y,lamda = args;
             l = np.size(X,1);
             theta = np.reshape(theta,(l,1));
             m = np.size(X,0);
             y = np.reshape(y,(m,1));
             h = sigmoid( X.dot(theta) );
    
             grad = (1/m) * X.T.dot( h-y );
             grad[1:np.size(grad),] = grad[1:np.size(grad),] + 
                 (lamda/m)*theta[1:np.size(theta),] ;
    
         return grad.ravel()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-23
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 2011-08-25
      相关资源
      最近更新 更多