【问题标题】:Is there a JavaScript equivalent to numpy.linalg.pinv?是否有与 numpy.linalg.pinv 等效的 JavaScript?
【发布时间】:2021-03-01 21:34:02
【问题描述】:

在给定由用户在网站上使用 Javascript 输入生成的矩阵 A 的情况下,我正在尝试求解超定 (Ax = B) 的线性方程组。在 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 的伪逆函数的问题。如果没有,是否有其他解决方案?

【问题讨论】:

标签: javascript numpy


【解决方案1】:

问: 如果没有,还有其他解决方案吗?

是的,有办法。

实施分布式处理工作流程。让 JavaScript 发挥它的作用,让 numpy 一边做它如此聪明的工作。类似的概念在许多用例中很常见,在这些用例中,专门的工具可以解决部分问题,而一些工作流集成调解器将分布式部分“粘合”在一起。

所以,让 JavaScript 部分配备 ZeroMQ/zmqnanomsg,通过互连将 A, B 通信到在 python 方面,numpy 将尽其所能进行智能的矢量化数字运算,并让接收到的结果传递回处理工作流程的任何下一阶段。

ZeroMQ 多年来一直拥有用于非常快速和高效的无协议{ ipc:// | vmci:// } localhost 互连的智能工具,此外,如果您的 localhost 资源对于更大的资源来说变得非常小,它还具有类似的智能但非本地协议用于{ tcp:// | udp:// | ... } 数据中心互连矩阵大小。

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

剩下的就是为任何给定的数据量和请求的前端/后端事务运行的节奏挤出最大性能。

~ 80 [ms] 下使用此架构进行了周转时间,您的想象力就是您的极限。还尽可能快地完成了一些multi-TB线性代数处理,这里需要更加小心,但以性能为动机的原则是相同的。

【讨论】:

    【解决方案2】:

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

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

    如果是这种情况,与计算伪逆(即使用 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 端口真正公开了这个功能。

    【讨论】:

      猜你喜欢
      • 2021-03-19
      • 2010-09-10
      • 1970-01-01
      • 2015-03-14
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      相关资源
      最近更新 更多