2017-03-03 74 views
0

我有一个损失函数,我想尝试,并尽量减少:我可以实现任意凸失效函数的梯度下降吗?

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

回答

0

您可以通过一个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 

原谅鳕鱼的天真性E,我几乎不知道如何写一些Python :-)

0

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

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