我有以下代码:
dotp = np.dot(X[i], w)
mult = -Y[i] * dotp
lhs = Y[i] * X[i]
rhs = logistic(mult)
s += lhs * rhs
它会抛出以下错误(为简洁而截断):
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`
我期待lhs成为列向量而rhs是标量,因此操作应该有效。 为了调试,我打印了尺寸:
print "lhs", np.shape(lhs)
print "rhs", rhs, np.shape(rhs)
哪个输出:
lhs (1, 18209)
rhs [[ 0.5]] (1, 1)
所以看起来它们兼容乘法。关于我做错了什么的任何想法?
编辑:有关我尝试做的更多信息。
此代码用于实现类似日志的梯度来估计系数。
其中z
是权重与x值的点积。
我尝试实现这个:
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
答案 0 :(得分:6)
您的形状为lhs
的矩阵(1, 18209)
和形状rhs
的{{1}}并且您正试图将它们相乘。由于它们属于(1, 1)
类型(从堆栈跟踪看来),matrix
运算符会转换为*
。 Matrix产品仅针对第一个矩阵中的列数和第二个矩阵中的行数相等的情况定义,在您的情况下,它们不是(dot
和{{1} })。因此错误。
如何修复它:检查代码背后的数学并修复公式。也许你忘了转置第一个矩阵或类似的东西。
答案 1 :(得分:0)
矢量' numpy lib上的形状就像(3,)。当你尝试将它们与np.dot(a,b)func相乘时,它会产生昏暗错误。此时应使用np.outer(a,b)func。