【问题标题】:Can I implement a gradient descent for arbitrary convex loss function?我可以为任意凸损失函数实现梯度下降吗?
【发布时间】:2017-07-24 02:00:57
【问题描述】:

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

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 函数,但它需要我在预先确定的点传递一个标量字段。

【问题讨论】:

    标签: numpy mathematical-optimization


    【解决方案1】:

    您可以通过central difference 以数值方式估计导数:

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

    并像这样使用它:

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

    上面的代码对dimX = 1有效,需要做一些修改来解释多维向量X:

    def gradient(fun, X, b, lambs, h):
        res = []
        for i in range (0,len(X)):
            t1 = list(X)
            t1[i] = t1[i] + 0.5*h
            t2 = list(X)
            t2[i] = t2[i] - 0.5*h
            res = res + [(fun(t1,b,lambs) - fun(t2,b,lambs))/h]
        return res
    

    原谅代码的幼稚,我几乎不知道如何写一些python :-)

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-25
        • 2014-03-14
        • 2012-05-22
        • 2021-02-20
        • 2020-09-29
        • 2023-03-19
        相关资源
        最近更新 更多