Python - Liste mit arrays der Form Fragen
Ich bin momentan dabei, einen code zum ausführen eines perceptron-Algorithmus, und ich kann nicht erstellen Sie eine zufällige matrix die Art, wie ich es brauche:
from random import choice
from numpy import array, dot, random
unit_step = lambda x: -1 if x < 0 else 1
import numpy as np
m=3 #this will be the number of rows
allys=[]
for j in range(m):
aa=np.random.rand(1,3)
tt=np.random.rand(3)
yy=dot(aa,tt)
ally = [aa, yy]
allys.append(ally)
print "allys", allys
w = random.rand(3)
errors = []
eta = 0.2
n = 10
x=[1,3]
for i in xrange(n):
print i
x, expected = choice(allys)
print "x", x
Bekommen und habe das problem hier:
result = dot(x,w)
error = expected - unit_step(result)
errors.append(error)
w += eta * error * x
print x, expected, w, error, result, errors
Sagt der log
w += eta * Fehler * x
ValueError: nicht-broadcastable output-Operanden-Form (3,) nicht
match-broadcast-Form (1,3)
Die Idee ist es, Ergebnis looping nach dem Zufallsprinzip über die "Tabelle" allys.
Wie kann ich dieses Problem lösen? Was ist die Form(3,)?
Dank!
- Was sind die "allys"?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Fehlermeldung eigentlich sagt Ihnen, was falsch ist. Das Ergebnis deiner Multiplikation ist ein (1,3) array (2D-array (eine Zeile, drei Spalten), in der Erwägung, dass Sie versuchen, fügen Sie es in ein 3-element Vektor.
Beide arrays haben drei Elemente in eine Zeile, so dass, wenn Sie dies tun:
gibt es keine Fehler, in der Zeile, aber der resultierende Vektor wird tatsächlich ein (1,3) - array. Das ist unerwünscht, da dann die
dot
funktioniert nicht.Es gibt mehrere Möglichkeiten, um das problem zu lösen, aber vielleicht die am einfachsten zu Lesen ist, neu zu gestalten
x
für die Berechnung werden ein 3-element Vektor (1D-array):Eventuell eine sauberere Lösung wäre zu definieren
w
als (1,3) 2D-array, als auch, und dann transponierenw
für diedot
. Das ist wirklich eine Frage des Geschmacks.Für numpy-arrays, Form-Attribut gibt array-Dimensionalität. In deinem Fall
w.shape
ist(3,)
. Dies bedeutet, dassw
ist ein eindimensionales array mit 3 Elementen. Wiederumx.shape
ist(1,3)
, was bedeutet, dassx
ist ein zweidimensionales array mit einer Zeile und 3 Spalten. Sie bekommen eine Fehlermeldung, da der interpreter ist verwirrt darüber, wie die Formen. Ich bin nicht sicher, was Sie versuchen zu tun, so ist es schwer zu schlagen die Lösung. Aber möchten Sie vielleicht, um zu versuchen, die Neugestaltung eines der arrays. Zum Beispielx = x.reshape((3,))
für die Anpassung der Form von x auf w.