【问题标题】:Python Numpy Logistic RegressionPython Numpy 逻辑回归
【发布时间】:2017-10-05 14:29:18
【问题描述】:

我正在尝试在 python 中使用矢量化逻辑回归 麻木的。我的成本函数 (CF) 似乎工作正常。然而有一个 梯度计算的问题。它返回 3x100 数组,而它 应该返回 3x1。我认为(hypo-y) 部分有问题。

def sigmoid(a):
   return 1/(1+np.exp(-a))    

def CF(theta,X,y):
   m=len(y)
   hypo=sigmoid(np.matmul(X,theta))
   J=(-1./m)*((np.matmul(y.T,np.log(hypo)))+(np.matmul((1-y).T,np.log(1-hypo))))
   return(J)

def gr(theta,X,y):
    m=len(y)
    hypo=sigmoid(np.matmul(X,theta))

    grad=(1/m)*(np.matmul(X.T,(hypo-y)))

    return(grad)

X 是 100x3 阵列,y 是 100x1,theta 是 3x1 阵列。看起来这两个函数都是单独工作的,但是这个优化函数给出了一个错误:

optim = minimize(CF, theta, method='BFGS', jac=gr, args=(X,y)) 

错误:“ValueError:形状 (3,100) 和 (3,100) 未对齐:100 (dim 1) != 3 (dim 0)”

【问题讨论】:

  • 请展示您如何使用示例输入调用函数。我认为这与最终的形状有很大关系。
  • 我的 X 输入是 100X3 数组,y 输入是 100X1,theta 输入是 3X1 数组。现在看来这两个函数单独工作但是这个优化函数给出了一个错误: optim= minimum(CF, theta, method='BFGS', jac=gr, args=(X,y)) 错误:“ValueError:shapes (3,100 ) 和 (3,100) 未对齐:100 (dim 1) != 3 (dim 0)" 感谢您的关注!

标签: python numpy vectorization gradient logistic-regression


【解决方案1】:

我认为 (hypo-y) 部分有问题。

准点!

hypo 的形状为 (100,)y 的形状为 (100, 1)。在 element-wise - 操作中,hypo 根据 numpy 的 broadcasting rules 被广播以塑造 (1, 100)。这会产生一个(100, 100) 数组,这会导致矩阵乘法产生一个(3, 100) 数组。

通过将hypo 变为与y 相同的形状来解决此问题:

hypo = sigmoid(np.matmul(X, theta)).reshape(-1, 1)  # -1 means automatic size on first dimension

还有一个问题:scipy.optimize.minimize(我假设您正在使用)期望渐变是一个形状为 (k,) 的数组,但函数 gr 返回一个形状为 (k, 1) 的向量。这很容易解决:

return grad.reshape(-1)

最终函数变为

def gr(theta,X,y):
    m=len(y)
    hypo=sigmoid(np.matmul(X,theta)).reshape(-1, 1)
    grad=(1/m)*(np.matmul(X.T,(hypo-y)))
    return grad.reshape(-1)

并使用玩具数据运行它(我没有检查数学或结果的合理性):

theta = np.reshape([1, 2, 3], 3, 1)    
X = np.random.randn(100, 3)
y = np.round(np.random.rand(100, 1))    

optim = minimize(CF, theta, method='BFGS', jac=gr, args=(X,y))
print(optim)
#      fun: 0.6830931976615066
# hess_inv: array([[ 4.51307367, -0.13048255,  0.9400538 ],
#       [-0.13048255,  3.53320257,  0.32364498],
#       [ 0.9400538 ,  0.32364498,  5.08740428]])
#      jac: array([ -9.20709950e-07,   3.34459058e-08,   2.21354905e-07])
#  message: 'Optimization terminated successfully.'
#     nfev: 15
#      nit: 13
#     njev: 15
#   status: 0
#  success: True
#        x: array([-0.07794477,  0.14840167,  0.24572182])

【讨论】:

    猜你喜欢
    • 2020-03-22
    • 2016-12-01
    • 1970-01-01
    • 2016-03-06
    • 2016-03-09
    • 2011-04-14
    • 2014-12-19
    • 2018-11-05
    • 1970-01-01
    相关资源
    最近更新 更多