python numpy 求逆_numpy-用于快速矩阵求逆的伍德伯里身份-比...

Woodbury matrix identity指出,可以通过对原始矩阵的逆进行秩k校正来计算某些矩阵的逆k校正.

如果A是通过UCV进行秩校正的p×p满秩矩阵,其中U为p×k,C为k×k,V为k×p,则伍德伯里恒等式为:

(A + UCV)^{-1} = A^{-1} - A^{-1} U (C^{-1} + V A^{-1} U)^{-1} V A^{-1}

关键在于,您不需反转p×p矩阵,而需反转k×k矩阵.在许多应用中,我们可以假设k <k. p.在某些情况下,例如,如果A是对角矩阵,则A的反相可能会很快.

我在这里实现了这一点,假设A是对角线,而C是标识:

def woodbury(A, U, V, k):

A_inv = np.diag(1./np.diag(A)) # Fast matrix inversion of a diagonal.

B_inv = np.linalg.inv(np.eye(k) + V @ A_inv @ U)

return A_inv - (A_inv @ U @ B_inv @ V @ A_inv)

理智通过验证

n = 100000

p = 1000

k = 100

A = np.diag(np.random.randn(p))

U = np.random.randn(p, k)

V = U.T

M = U @ V + A

M_inv = woodbury(A, U, V, k)

assert np.allclose(M @ M_inv, np.eye(p))

但是,当我将其与numpy.linalg.inv进行实际比较时,我的Woodbury函数并没有我期望的那么快.我希望时间反转以三次方p增长.但是我的结果是:

我的问题是:为什么伍德伯里方法这么慢?仅仅是因为我正在将Python代码与LAPACK进行比较,还是发生了其他事情?

编辑:我对einsum()与广播的实验

我实现了三个版本:(1)使用einsum和einsum_path,(2)使用每个接受的答案的广播,以及(3)使用两者.这是我使用einsum的实现,使用einsum_path进行了优化:

def woodbury_einsum(A, U, V, k):

A_inv = np.diag(1./np.diag(A))

tmp = np.einsum('ab,bc,cd->ad',

V, A_inv, U,

optimize=['einsum_path', (1, 2), (0, 1)])

B_inv = np.linalg.inv(np.eye(k) + tmp)

tmp = np.einsum('ab,bc,cd,de,ef->af',

A_inv, U, B_inv, V, A_inv,

optimize=['einsum_path', (0, 1), (0, 1), (0, 2), (0, 1)])

return A_inv - tmp

结果在这里:

因此,避免使用对角矩阵的矩阵乘法的计算成本比使用einsum()优化矩阵乘法的顺序和内存占用要快.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习人工智能,机器学习都离不开数学基础和编程知识。无论你是数据科学的初学者还是已经从事人工智能开发的有经验人员,这门课都适合于你。为什么这么说?首先人工智能和机器学习本质上就是算法,而算法就是数学及统计学以及编程的结合。当前市场上有许多开源的软件包如SKLEARN确实可以帮助没经验的或缺乏数学或算法基础的人实现机器学习模型及预测,但这些工具无法使你真正懂得算法的本质或来源,或者无法使你在不同场合下灵活运用及改进算法。记住,在实际工作中找到适合应用场景的解决方案是最难但是最重要的。但这离不开数学基础和算法理解。比如,线性回归是一类普遍的机器学习算法,所有的机器学习软件都有现成的方法实现模型,但如果在训练数据中加入几条新数据,那么新建立的模型和原来的模型有和联系或不同?再比如,为什么深度神经网络中的Sigmoid函数一般只用到输出层?神经网络的向后传播理论如何与泰勒展开和复合函数的偏导数联系在一起?人工智能中推荐系统和文字向量如何与矩阵的奇异分解以及特征向量联系?模型中对标签进行数据变换如何影响预测值?所有这些问题的答案,你都可以从本课中找到线索。本课系统地讲述了有关人工智能,机器学习背后的数学知识。特别指出,微积分和代数知识是本课的核心。统计学基础被安排在另外的课程中。除此之外,我在每一章节或主要知识点后都安排了各类程序以解释和回顾所学到的东西。最后要提到的是,这不是一门工程项目实践课。但我会另外专门安排有关人工智能,机器学习的实践课程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值