Ich versuche einen Vektor zu finden, der die Restsumme der Quadrate minimiert, wenn eine Matrix multipliziert wird.Finde den optimalen Vektor, der die Funktion minimiert
Ich kenne scipy's optimize-Paket (das eine Minimierungsfunktion hat). Es gibt jedoch eine zusätzliche Einschränkung für meinen Code. Die Summe aller Einträge von w (siehe Funktion unten) muss gleich 1 sein, und kein Eintrag von w darf kleiner als 0 sein. Gibt es ein Paket, das das für mich tut? Wenn nicht, wie kann ich das tun?
Der Versuch, zu minimieren w:
def w_rss(w,x0,x1):
predictions = np.dot(x0,w)
errors = x1 - predictions
rss = np.dot(errors.transpose(),errors).item(0)
return rss
X0 = np.array([[3,4,5,3],
[1,2,2,4],
[6,5,3,7],
[1,0,5,2]])
X1 = np.array([[4],
[2],
[4],
[2]])
W = np.array([[.0],
[.5],
[.5],
[.0]])
print w_rss(W,X0,X1)
Bisher dies bei Durchschleifen möglichen Werte von w mein bester Versuch ist, aber es ist nicht richtig funktioniert.
def get_w(x0,x1):
J = x0.shape[1]
W0 = np.matrix([[1.0/J]*J]).transpose()
rss0 = w_rss(W0,x0,x1)
loop = range(J)
for i in loop:
W1 = W0
rss1 = rss0
while rss0 == rss1:
den = len(loop)-1
W1[i][0] += 0.01
for j in loop:
if i == j:
continue
W1[j][0] -= 0.01/den
if W1[j][0] <= 0:
loop.remove(j)
rss1 = w_rss(W1,x0,x1)
if rss1 < rss0:
#print W1
W0 = W1
rss0 = rss1
print '--'
print rss0
print W0
return W0,rss0
Sie können Verwenden Sie dafür einen QP-Löser (quadratische Programmierung). –
Ich habe dies in scipy.optimize versucht: Cons = ({'Typ': 'eq', 'Spaß': Lambda x: 1 - Summe (x)}) {{NEW LINE}} bnds = Tupel ((0,1) für x in W) {{NEUE LINIE}} minimieren (w_rss, W1, args = (V, X0, X1), Methode = 'SLSQP', Grenzen = Bnds, Einschränkungen = Nachteile). Lösung war falsch. –
Dies ist ein Allzweck-NLP-Löser. Es sollte mit einem ordnungsgemäßen Setup-Problem funktionieren, aber ich würde empfehlen, einen echten QP-Solver zu verwenden. –