2017-06-01 6 views
0

Ich versuche derzeit, dieses Beastie in Python (mit den numpy-Bibliotheken) zu programmieren. Der Lambda * w soll außerhalb der Summe liegen.Effizient Codierung Gradienten der Funktion

Derzeit habe ich das Problem mit einer for-Schleife und einer laufenden Summe außerhalb codiert; Dieser Ansatz benötigt jedoch viel Zeit. Meine Vektoren für y, w und x sind sehr groß - denken Sie an 100.000 Elemente. Ich habe mich gefragt, ob es eine einfachere Möglichkeit gibt, das Element zu vektorisieren, anstatt einfache Matrixoperationen zu verwenden, anstatt den Vektor eines Elements durch ein anderes Element zu durchlaufen.

Das ist mein vektorisiert Code:

xty = xtrain.T.dot(ytrain) 
e = math.exp(-w_0.T.dot(xty)) 
gradient = (-xty*(e/1+e)-lambda_var*w_0) 

gradient

+0

Teilen Ihr Loopy-Code? Bitte fügen Sie nach Möglichkeit auch möglichst wenige Beispiele für repräsentative relevante Eingaben hinzu. – Divakar

Antwort

0

Wenn ich Ihr Problem richtig verstanden habe, könnten Sie müssen nur den sauren Apfel beißen und mit der Schleife gehen:

import numpy as np 
wave = 1e3 
xs, ys, w = np.arange(1, 4), np.arange(4, 7), np.arange(7, 10) 
eps = np.zeros(w.T.shape) 
for x, y in zip(xs, ys): 
    eps += -y * np.exp(-y * w.T * x) * x/(1 + np.exp(-y * w.T * x)) 
print(eps + wave * w) 

[ 7000. 8000. 9000.] 
Verwandte Themen