Python 用numpy线性代数计算二次响应
我在numpy中操作矩阵时遇到问题。我有一个N个输入的向量,θ,我想用二次模型计算一个标量响应,θ^ T aθ+θ^ T b+c,其中^T表示转置,a是NxN平方矩阵,b是N维向量,c是标量。当θ是一个(NxM)矩阵时,意味着我有Mθ值要传播,我必须计算θ^ T Aθ以产生一个M维矩阵。在索引表示法中,计算是θ{mj}A{ji}θ{im},其中m不能求和 如果我只有一组θ值,numpy的线性代数就如预期的那样工作(这里,N=10,M=1): 我认为θTθ的运算可能不同于点积。当我制作θ和NxM矩阵时,我不明白什么是根本不同的。我认为额外的维度自然会贯穿这段代码,就像它对b和c项所做的一样 如何使numpy从操作theta^T A theta返回M维数组? 我只能让它返回平方矩阵。遗憾的是,点积函数将此操作视为矩阵乘法(此处,N=10,M=5): 相反,b和c项自然携带额外的θ项,并提供我想要的M维输出:Python 用numpy线性代数计算二次响应,python,arrays,numpy,matrix,linear-algebra,Python,Arrays,Numpy,Matrix,Linear Algebra,我在numpy中操作矩阵时遇到问题。我有一个N个输入的向量,θ,我想用二次模型计算一个标量响应,θ^ T aθ+θ^ T b+c,其中^T表示转置,a是NxN平方矩阵,b是N维向量,c是标量。当θ是一个(NxM)矩阵时,意味着我有Mθ值要传播,我必须计算θ^ T Aθ以产生一个M维矩阵。在索引表示法中,计算是θ{mj}A{ji}θ{im},其中m不能求和 如果我只有一组θ值,numpy的线性代数就如预期的那样工作(这里,N=10,M=1): 我认为θTθ的运算可能不同于点积。当我制作θ和NxM矩
In [8]: theta.T.dot(b) + 1
Out[8]: array([11., 11., 11., 11., 11.])
两种可能性:
N,M = 10,5
A = np.random.randint(0,10,(N,N))
theta = np.random.randint(0,10,(N,M))
b = np.random.randint(0,10,N)
1) 使用matmul将>2D操作数视为堆栈的事实:
(theta.T[:,None]@A@theta.T[...,None])[...,0,0] + b@theta + 1
# array([ 8188, 14837, 7697, 9719, 7262])
或
2) 使用einsum
np.einsum("ik,ij,jk->k",theta,A,theta) + b@theta + 1
# array([ 8188, 14837, 7697, 9719, 7262])
与逐个验证评估进行比较:
[t@A@t + b@t + 1 for t in theta.T]
# [8188, 14837, 7697, 9719, 7262]
谢谢此处使用
@
符号的符号的名称是什么?我以前没见过,这是矩阵乘法运算。相应的dunder是\uuuu matmul\uuuu
。
np.einsum("ik,ij,jk->k",theta,A,theta) + b@theta + 1
# array([ 8188, 14837, 7697, 9719, 7262])
[t@A@t + b@t + 1 for t in theta.T]
# [8188, 14837, 7697, 9719, 7262]