首页 > 解决方案 > numpy:如何计算雅可比矩阵

问题描述

我做了一个两个矩阵的点积的例子,我想计算这个点积的雅可比矩阵。第一个矩阵的形状为 4x3,第二个矩阵的形状为 2x4。生成的雅可比矩阵应该具有 (4x3x2x3) 的形状,因为我是在第一个矩阵中计算它。

因此,假设雅可比矩阵的每个元素都是 DiDjAkAl,该元素将表示 i,j 输出与 k,l 输入的偏导数。这是代码中的示例:

import numpy as np

A = np.array([[1,2,3,4],
              [5,6,7,8],
              [9,10,11,12]])
#shape = (4x3)

b = np.array([[1,2],
              [3,4],
              [5,6],
              [7,8]])
#shape = (2x4)

dotProduct = A.dot(b)
#shape = (2x3)

所以基本上我的问题是如何找到那个点积的雅可比。

标签: pythonnumpymathmatrix

解决方案


从您的解决方案开始,我们可以看到 Indexesik始终是相同的值,因此可以删除 for 循环。然后可以使用列表作为切片一次性分配第一个 for 循环。具体来说:

def vect_jacobian(A,b):

    dotProduct = A.dot(b)
    ans = np.zeros((A.shape[0], A.shape[1], dotProduct.shape[0], dotProduct.shape[1]))
    L = list(range(A.shape[0]))
    ans[L,:,L,:] = b
    return ans

r = vect_jacobian(A,b)

在我的本地机器上使用%timeit,我们可以看到即使使用这些小尺寸矩阵,也有 3 倍的时间改进:

%timeit jacobian(A,b)
29.6 µs ± 3.74 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit vect_jacobian(A,b)
10.4 µs ± 589 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

推荐阅读