Ich berechne Tausende von Verläufen und möchte die Berechnungen in Python vektorisieren. Der Kontext ist SVM und die Verlustfunktion ist Scharnierverlust. Y ist Mx1, X ist MxN und w ist Nx1.Wie vektorisieren Scharnier Verlustgradientenberechnung
L(w) = lam/2 * ||w||^2 + 1/m Sum i=1:m (max(0, 1-y[i]X[i]w))
Der Gradient dieser ist
grad = lam*w + 1/m Sum i=1:m {-y[i]X[i].T if y[i]*X[i]*w < 1, else 0}
stattdessen durch jedes Element der Summe der Looping und Auswertung der MAX-Funktion ist es möglich, dies zu vektorisieren? Ich möchte wie die
grad = np.where(y*X.dot(w) < 1, -X.T.dot(y), 0)
folgend etwas wie np.where verwenden Das funktioniert nicht, weil, wenn die Bedingung erfüllt ist, -X.T * y die falsche Dimension ist.
bearbeiten: Liste Verständnis Version, möchte wissen, ob es ein sauberes ist oder mehr optimal
def grad(X,y,w,lam):
# cache y[i]*X[i].dot(w), each row of Xw is multiplied by a single element of y
yXw = y*X.dot(w)
# cache y[i]*X[i], note each row of X is multiplied by a single element of y
yX = X*y[:,np.newaxis]
# return the average of this max function
return lam*w + np.mean([-yX[i] if yXw[i] < 1 else 0 for i in range(len(y))])