Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用numpy线性代数计算二次响应_Python_Arrays_Numpy_Matrix_Linear Algebra - Fatal编程技术网

Python 用numpy线性代数计算二次响应

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矩

我在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维输出:

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]