使用python求解非方矩阵A的Ax = b

时间:2017-09-23 07:49:06

标签: python numpy matrix

我专注于特殊情况,其中A是n×d矩阵(其中k numpy提供的工具,但它们只适用于方形矩阵。我有一种方法是用一些线性独立的向量填充矩阵以“平方”它然后求解,但我无法弄清楚如何选择那些向量使它们线性地独立于基向量,加上我认为它是不是唯一的方法,我错过了一些可以使这更容易的东西。 确实比我提到的方法更简单吗?如果没有,我究竟如何选择那些将A完成为方阵的矢量?

2 个答案:

答案 0 :(得分:3)

正如您所提到的,np.linalg.solve需要一个完整的等级矩阵。

对于所有其他线性情况,如果您对min||Ax-b||^2.感兴趣(可能是),则可以使用np.linalg.lstsq

  

通过计算最小化欧几里德2范数的向量x来求解方程a x = b || b - a x || ^ 2。

     

等式可能低于,良好或超定(即,a的线性独立行的数量可以小于,等于或大于其线性数量独立专栏)。如果a是正方形且满秩,则x(但对于舍入误差)是等式的“精确”解。

(我的粗体注释)

原始np.linalg.solve的文档中也提到了这一点:

  

必须是正方形且满秩,即所有行(或等效地,列)必须是线性独立的;如果其中任何一个不成立,则使用lstsq作为系统/方程的最小二乘最佳“解”。

答案 1 :(得分:0)

如果您的方程式少于未知数(假设您打算键入n< d),那么您并不期望有一个独特的解决方案。您可以使用奇异值分解来获得解。

  • 首先找到SVD,使用numpy.linalg.svd由三个矩阵U S V ^ T组成。然后你可以从V [diag(1 / s_j)] U ^ T得到A的伪逆,这给你一个解决方案。
  • 您的最终解决方案将是您找到的解决方案,以及A的零空间基矢量的线性组合。
  • 为了找到A的零空间基矢量,从矩阵V中提取对应于来自矩阵S的奇异值s_j的列j为零(或者,低于某些"小"阈值)。

你可以使用for循环和放大器在Python中很容易地实现这最后一点。如果陈述 - 繁重的是分解本身。 Press et al的优秀Numerical Recipes涵盖了第2章中的线性代数(C herehere中免费提供的数字食谱版本)。他们对SVD进行了很好的介绍,解释了SVD的理论以及如何转化为算法(主要关注如何<强>使用 SVD的结果)。它们提供的SVD对象具有比numpy.linalg.svd更多的功能,但如上所述,核心功能是实际的分解,并且执行诸如获取零空间基向量之类的东西只是围绕for循环和if在U,S上运行的语句,和V。