2017-03-03 1 views
0

J'ai une fonction de perte que je voudrais essayer de minimiser:Puis-je implémenter une descente de gradient pour une fonction de perte convexe arbitraire?

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() 

descente de gradient, ou des méthodes similaires, pourraient être utiles. Je ne peux pas calculer analytiquement le gradient de cette fonction, aussi je me demande comment je peux calculer numériquement le gradient de cette fonction de perte pour implémenter une méthode de descente.

Numpy a une fonction gradient, mais elle nécessite de passer un champ scalaire à des points pré-déterminés.

Répondre

0

Vous pouvez estimer la dérivée numériquement par un 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 

Et l'utiliser comme ceci:

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

Le code ci-dessus est valable pour dim X = 1, sont nécessaires des modifications à compte pour le vecteur multidimensionnel 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 

Pardonner la naïveté de la morue e, je sais à peine comment écrire un certain python :-)

0

Vous pouvez essayer scipy.optimize.minimize Pour votre cas, un exemple d'appel serait:

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