我主要讨论A是n x d矩阵的特殊情况(其中k〈d)表示R^d的子空间的正交基,并且已知b在该子空间内。我想到使用numpy提供的工具,然而,它们只适用于方阵。我有一种方法,用一些线性独立的向量填充矩阵来“平方”然后求解,但我不知道如何选择这些向量,使它们与基向量线性无关,而且我认为这不是唯一的方法,我缺少一些可以使这更容易的东西。是否真的有比我提到的更简单的方法?如果没有,我到底该如何选择那些向量来使A完备化为一个方阵呢?
A
numpy
lf3rwulv1#
如前所述,np.linalg.solve需要一个满秩方阵。对于所有其他线性情况,如果您对min||Ax-b||^2.感兴趣(您可能会感兴趣),可以使用np.linalg.lstsq.通过计算使欧氏2范数最小化的向量x来求解方程a x = B||B - a x||^2。方程可以是欠定的、良定的或超定的(即,a的线性独立行的数目可以小于、等于或大于其线性独立列的数目)。如果a是平方的且满秩的,则x(不考虑舍入误差)是方程的“精确”解。(bold本人注解)原始np.linalg.solve的文档中也提到了这一点:a必须是正方形的并且是满秩的,即所有行(或者等价地,列)必须是线性无关的;如果其中一个不为真,则使用lstsq作为系统/方程的最小二乘最佳“解”。
min||Ax-b||^2.
np.linalg.solve
zsbz8rwp2#
如果方程的个数少于未知数(假设您要键入n〈d),则不需要唯一的解。您可以使用奇异值分解来获得解。
在Python中,使用for循环和if语句可以很容易地实现最后一点--最重要的是分解本身。(C here和here中的数值食谱的免费版本)。他们对SVD有很好的介绍,解释了SVD的理论以及如何将其转化为算法(主要关注如何使用SVD的结果)它们提供了一个比numpy.linalg.svd功能更多的SVD对象,但正如前面提到的,核心功能是实际的分解,而像获得零空间基向量这样的事情只是在为循环和if语句操作U、S和V做修饰。
igetnqfo3#
可以用途:
np.linalg.lstsq(x, y)
np.linalg.pinv(X) @ y
LinearRegression().fit(X, y)
y = ax + b
yws3nbqq4#
除了上面提到的Numpy资源,我还想添加SymPy中的Solveset模块,特别是linsolve。解M个变量的N个线性方程组既支持欠定系统又支持超定系统。解的可能数目为零、一或无穷大。零解会引发ValueError,而无穷大解则以给定符号的形式参数化表示。对于唯一解,将返回有序元组的FiniteSet。他们接着提供了示例,并描述了输入Ax = b所支持的格式。就我个人而言,我已经成功地将这个模块集成到我的Python项目中,所以我想将它添加到对话中。
linsolve
FiniteSet
Ax = b
4条答案
按热度按时间lf3rwulv1#
如前所述,np.linalg.solve需要一个满秩方阵。
对于所有其他线性情况,如果您对
min||Ax-b||^2.
感兴趣(您可能会感兴趣),可以使用np.linalg.lstsq.通过计算使欧氏2范数最小化的向量x来求解方程a x = B||B - a x||^2。
方程可以是欠定的、良定的或超定的(即,a的线性独立行的数目可以小于、等于或大于其线性独立列的数目)。如果a是平方的且满秩的,则x(不考虑舍入误差)是方程的“精确”解。
(bold本人注解)
原始
np.linalg.solve
的文档中也提到了这一点:a必须是正方形的并且是满秩的,即所有行(或者等价地,列)必须是线性无关的;如果其中一个不为真,则使用lstsq作为系统/方程的最小二乘最佳“解”。
zsbz8rwp2#
如果方程的个数少于未知数(假设您要键入n〈d),则不需要唯一的解。您可以使用奇异值分解来获得解。
在Python中,使用for循环和if语句可以很容易地实现最后一点--最重要的是分解本身。(C here和here中的数值食谱的免费版本)。他们对SVD有很好的介绍,解释了SVD的理论以及如何将其转化为算法(主要关注如何使用SVD的结果)它们提供了一个比numpy.linalg.svd功能更多的SVD对象,但正如前面提到的,核心功能是实际的分解,而像获得零空间基向量这样的事情只是在为循环和if语句操作U、S和V做修饰。
igetnqfo3#
可以用途:
np.linalg.lstsq(x, y)
np.linalg.pinv(X) @ y
LinearRegression().fit(X, y)
其中1和2来自numpy,3来自sklearn.linear_model。
顺便说一句,您需要在1和2中连接1(使用np.ones_like)来表示公式
y = ax + b
的偏差yws3nbqq4#
除了上面提到的Numpy资源,我还想添加SymPy中的Solveset模块,特别是
linsolve
。解M个变量的N个线性方程组既支持欠定系统又支持超定系统。解的可能数目为零、一或无穷大。零解会引发ValueError,而无穷大解则以给定符号的形式参数化表示。对于唯一解,将返回有序元组的
FiniteSet
。他们接着提供了示例,并描述了输入
Ax = b
所支持的格式。就我个人而言,我已经成功地将这个模块集成到我的Python项目中,所以我想将它添加到对话中。