ValueError:矩阵未对齐

leo*_*sas 4 numpy matrix-multiplication

我有以下代码:

dotp = np.dot(X[i], w)
mult = -Y[i] * dotp
lhs = Y[i] * X[i]
rhs = logistic(mult)
s += lhs * rhs
Run Code Online (Sandbox Code Playgroud)

它会抛出以下错误(为简洁而截断):

  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`
Run Code Online (Sandbox Code Playgroud)

我期待lhs是一个列向量而rhs是一个标量,所以操作应该有效.为了调试,我打印了尺寸:

    print "lhs", np.shape(lhs)
    print  "rhs", rhs, np.shape(rhs)
Run Code Online (Sandbox Code Playgroud)

哪个输出:

lhs (1, 18209)
rhs [[ 0.5]] (1, 1)
Run Code Online (Sandbox Code Playgroud)

所以似乎它们兼容乘法.关于我做错了什么的任何想法?

编辑:有关我正在尝试做的更多信息.

该代码用于实现类似日志的梯度来估计系数.

在此输入图像描述

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
Run Code Online (Sandbox Code Playgroud)

fja*_*rri 7

你有一个lhs形状(1, 18209)rhs形状的矩阵,(1, 1)你正试图将它们相乘.由于它们是matrix类型(从堆栈跟踪看起来),*运算符转换为dot.Matrix产品仅针对第一个矩阵中的列数和第二个矩阵中的行数相等的情况定义,在您的情况下,它们不是(182091).因此错误.

如何解决它:检查代码背后的数学并修复公式.也许你忘了转置第一个矩阵或类似的东西.