Numpy ValueError:矩阵未对齐
我有以下代码:Numpy ValueError:矩阵未对齐,numpy,matrix-multiplication,Numpy,Matrix Multiplication,我有以下代码: dotp = np.dot(X[i], w) mult = -Y[i] * dotp lhs = Y[i] * X[i] rhs = logistic(mult) s += lhs * rhs 它向我抛出了以下错误(为简洁起见被截断): 我希望lhs是一个列向量,rhs是一个标量,所以这个操作应该可以工作。 为了调试,我打印了尺寸: print "lhs", np.shape(lhs) print "rhs", rhs, np.shape(rhs) 哪些产出
dotp = np.dot(X[i], w)
mult = -Y[i] * dotp
lhs = Y[i] * X[i]
rhs = logistic(mult)
s += lhs * rhs
它向我抛出了以下错误(为简洁起见被截断):
我希望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
您有一个形状为
(118209)
的矩阵lhs
,以及形状为(1,1)
的矩阵rhs
,您正在尝试将它们相乘。由于它们是矩阵
类型(从堆栈跟踪中可以看出),因此*
运算符转换为点
。矩阵积仅在第一个矩阵中的列数与第二个矩阵中的行数相等的情况下定义,而在您的情况下,它们不相等(18209
和1
)。因此出现了错误
如何修复:检查代码背后的数学知识并修复公式。也许您忘记了转置第一个矩阵或类似的东西。numpy lib上向量的形状类似于(3,)。当你试着用np.dot(a,b)func乘以它们时,它会产生暗误差。此时应使用np.outer(a,b)func 请指定触发异常的行。另外,
.size
是数组中元素的总数;你需要打印(并包括在你的问题中)的是.shape
。从数学角度看,你想用lhs
和rhs
做什么?我试图用:a=np.random.uniform(0,10,(1,10));b=np.array([[0.5]]);a*b代码>并且它确实有效,所以我猜numpy假设,在本例中,(1,1)矩阵是标量的。为什么上面没有发生这种情况?。它们之间存在差异,尤其是*
转换为数组的元素乘法和矩阵的点
。执行打印类型(lhs)和打印类型(rhs)
以检查您拥有的内容。在你的问题中,你可以在堆栈跟踪中看到dot
被调用,所以我假设你有matrix
对象。在这个测试中,您将得到ndarray
对象,这将导致广播乘法,对于这些对象,形状是正确的。它们都是typematrix
。我将有缺陷的行更改为s+=lhs*np.float64(rhs)
,希望它能工作,直到抛出:ValueError:shape(18209)的不可广播输出操作数与广播形状(118209)不匹配。
。思想?(这可能脱离主题)如果要将矩阵转换为数组,请使用numpy.float64
只是将1x1矩阵转换为标量。
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