ValueError: matrices ne sont pas alignés
J'ai le code suivant:
dotp = np.dot(X[i], w)
mult = -Y[i] * dotp
lhs = Y[i] * X[i]
rhs = logistic(mult)
s += lhs * rhs
Et il me lance le message d'erreur suivant (tronqué pour des raisons de concision):
File "/Users/leonsas/Projects/temp/learners/learners.py", line 26, in log_likelihood_grad
s += lhs * rhs
File "/usr/local/lib/python2.7/site-packages/numpy/matrixlib/defmatrix.py", line 341, in __mul__
return N.dot(self, asmatrix(other))
`ValueError: matrices are not aligned`
Je m'attendais à lhs à être un vecteur colonne et rhs doit être un scalaire et donc que l'opération devrait fonctionner.
Pour déboguer, j'ai imprimé les dimensions:
print "lhs", np.shape(lhs)
print "rhs", rhs, np.shape(rhs)
Sorties:
lhs (1, 18209)
rhs [[ 0.5]] (1, 1)
Il semble donc qu'ils sont compatibles avec une multiplication. Toutes les pensées de ce que je fais mal?
EDIT: Plus d'informations de ce que je suis en train de faire.
Ce code est à mettre en œuvre un log-probabilité de gradient pour estimer les coefficients.
Où z
est le produit scalaire du poids avec les valeurs de x.
Ma tentative de mise en œuvre de cette:
def log_likelihood_grad(X, Y, w, C=0.1):
K = len(w)
N = len(X)
s = np.zeros(K)
for i in range(N):
dotp = np.dot(X[i], w)
mult = -Y[i] * dotp
lhs = Y[i] * X[i]
rhs = logistic(mult)
s += lhs * rhs
s -= C * w
return s
Veuillez spécifier la ligne à laquelle déclenche une exception. Aussi,
Qu'essayez-vous de le faire avec
.size
est le nombre total d'éléments dans le tableau; ce dont vous avez besoin pour l'impression (et à inclure dans votre question) est .shape
.Qu'essayez-vous de le faire avec
lhs
et rhs
, à partir d'un point de vue mathématique?OriginalL'auteur leonsas | 2014-12-16
Vous devez vous connecter pour publier un commentaire.
Vous avez une matrice
lhs
de forme(1, 18209)
etrhs
de forme(1, 1)
et vous essayez de les multiplier. Car ils sont dematrix
type (comme il semble, à partir de la trace de la pile), le*
opérateur se traduit pardot
. La matrice produit est définie uniquement pour le cas où le nombre de colonnes de la première matrice et le nombre de lignes dans le second, sont égaux, et dans votre cas, ils ne sont pas (18209
et1
). D'où l'erreur.Solution: vérifiez les mathématiques derrière le code et corriger la formule. Peut-être que vous avez oublié de transposition de la première matrice ou quelque chose comme ça.
a = np.random.uniform(0,10,(1,10)); b = np.array([[0.5]]); a * b;
et ça fonctionne, donc je suppose que numpy suppose, dans ce cas, que l' (1,1) est la matrice scalaire. Pourquoi n'est-elle pas au-dessus?Il y a
ndarray
etmatrix
types de numpy. Il y a des différences entre eux, en particulier*
se traduit par elementwise multiplication de matrices et dedot
pour les matrices. Neprint type(lhs), type(rhs)
pour vérifier ce que vous avez. Dans votre question, vous pouvez le voir dans la trace de la pile quidot
est appelée, donc j'ai supposé que vous aviezmatrix
objets. Dans ce test, vous obtenezndarray
objets, ce qui entraîne diffusé multiplication, dont les formes sont ok.Les deux sont de type
matrix
. J'ai changé les défauts de ligne às += lhs * np.float64(rhs)
en espérant que ça va marcher, et il fonctionne jusqu'à ce qu'il lance:ValueError: non-broadcastable output operand with shape (18209) doesn't match the broadcast shape (1,18209)
. Pensées? (Ce peut-être hors-sujet)Si vous voulez convertir des matrices à des tableaux, utiliser les
numpy.asarray
.numpy.float64
juste convertit vos 1x1 matrice par un scalaire.OriginalL'auteur fjarri
des vecteurs de la forme sur numpy lib sont comme (3,). lorsque vous essayez de les multiplier avec np.dot(a,b) func il donne dim erreur. np.externe(a,b) func doit être utilisé à ce point.
OriginalL'auteur guler