是否有与numpy.linalg.pinv等效的JavaScript?

时间:2019-07-24 05:17:57

标签: javascript numpy

在给定矩阵A的情况下,我正在尝试求解一个方程组的线性系统(Ax = B),矩阵A是由用户使用Javascript在网站上输入的内容生成的。在python中,我可以使用numpy.linalg.pinv(A)查找A的伪逆并将该伪逆与B乘以求解系统-是否有可以做的JavaScript等效项(库和/或代码段)这个吗?

我尝试使用math.js;尽管它似乎没有伪逆函数,但它还有其他矩阵运算。我尝试使用

math.multiply(math.inv(math.multiply(math.transpose(A), A)), math.transpose(A))

找到伪逆,但是我从A的转置乘以A得到的矩阵不是可逆的,因为A的列显然是线性相关的(我对线性代数不是很有经验,但这就是我所收集的网上的一些研究)。但是,即使矩阵A具有线性相关的列(我用numpy测试了系统),numpy仍然可以找到伪逆,这使我回到是否有一种方法可以复制numpy的伪逆函数的问题。如果没有,还有其他解决方案吗?

2 个答案:

答案 0 :(得分:1)

我知道自从提出这个问题以来已经有一段时间了,但是现在有一些用于在 JS 中进行线性代数的库(2021 年),我将其留在这里以供参考:

仅举几例。从您的问题来看,您似乎正在尝试解决最小二乘估计量: enter image description here

如果是这种情况,与计算伪逆(即使用 LU/QR/SVD 分解)相比,上述大多数(全部?)库提供了更稳健/性能更好的解决方案:

// Using ml-matrix
const { Matrix, solve } = require('ml-matrix');
var X = new Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
var y = Matrix.columnVector([8, 20, 32]);
var b = solve(X, y, (useSVD = true));

// Using linear algebra js
const { SparseMatrix, DenseMatrix } = require('linear-algebra');
// solve the linear system Ax = b, where A is a square sparse matrix
var X = SparseMatrix.identity(5, 5);
var y = DenseMatrix.ones(5, 1);

var lu = X.lu();
var b = lu.solveSquare(y);

然而,如果你真的需要计算伪逆,ml-matrix 是唯一支持这个的库(据我所知)。原则上,Eigen 也支持此功能,但我还没有看到任何 JS 端口实际公开此功能。

答案 1 :(得分:0)

  

问: 如果不是,是否还有其他解决方案?

是的,有办法。

实施分布式处理工作流程。让JavaScript发挥自己的作用,并让 numpy 一方来完成它如此聪明的工作。在许多用例中,类似的概念很常见,在这种情况下,专用工具可以解决问题的一部分,而某些工作流集成中介程序会将分布的部分“粘合”在一起。

因此,使JavaScript部分配备ZeroMQ / zmq nanomsg ,传达 A, B 在与python端的互连上,numpy会尽力进行智能的矢量化数字运算,并将接收到的结果传递回处理工作流程的下一个阶段。

ZeroMQ拥有多年的智能工具,可用于非常快速和高效的无协议{ ipc:// | vmci:// }本地主机互连,此外,如果本地主机资源将变为{ tcp:// | udp:// | ... }数据中心互连,则具有类似的智能但非本地协议对于较大的矩阵尺寸而言,尺寸过小。

nanomsg 提供了类似的工具,但是您必须检查JavaScript端可用端口/包装的可用性。

其余的只是挤出任何给定数据量的最大性能以及所请求的运行前端/后端事务的节奏。

~ 80 [ms]下使用这种架构的周转时间只是您的想像力。还已经尽可能快地完成了一些TB 线性代数处理,在那里将需要更多的注意,但是基于性能的原理是相同的。