我可以实现任意凸损函数的梯度下降吗?

时间:2017-03-03 20:15:51

标签: numpy mathematical-optimization

我有一个我想尝试和最小化的损失函数:

def lossfunction(X,b,lambs):

    B = b.reshape(X.shape)

    penalty = np.linalg.norm(B, axis = 1)**(0.5)

    return np.linalg.norm(np.dot(X,B)-X) + lambs*penalty.sum()

梯度下降或类似方法可能有用。我无法通过分析方法计算出这个函数的梯度,所以我想知道如何在数值上计算这个损失函数的梯度,以便实现下降法。

Numpy有一个gradient函数,但它要求我在预定点传递标量字段。

2 个答案:

答案 0 :(得分:0)

你可以用central difference数字估算导数:

 fruit
 fruit_name   color

 apple         red
 apple         green
 banana        yellow

并像这样使用它:

def derivative(fun, X, b, lambs, h):
    return (fun(X + 0.5*h,b,lambs) - fun(X - 0.5*h,b,lambs))/h

上面的代码对dimX = 1有效,需要进行一些修改以考虑多维向量X:

# assign values to X, b, lambs
# set the value of h
h = 0.001
print derivative(lossfunction, X, b, lambs, h)

原谅代码的天真,我几乎不知道怎么写一些python: - )

答案 1 :(得分:0)

你可以尝试scipy.optimize.minimize 对于您的情况,示例调用将是:

  import scipy.optimize.minimize
  scipy.optimize.minimize(lossfunction, args=(b, lambs), method='Nelder-mead')