4

这是我要解决的方程式:

h = (X'*X)^-1*X'*y

其中 X 是矩阵,y 是向量((X'X)^-1 是 X 转置乘以 X 的倒数)。我在 Matlab 中将其编码为:

h = (X'*X)\X'*y

我认为这是正确的。问题是 X 大约是 10000x10000,即使是我能找到的最强大的计算机(16 核,24GB RAM),试图计算这个逆也会使 Matlab 崩溃。有什么方法可以将其拆分,或者有一个专为进行如此大的反转而设计的库吗?

谢谢你。

4

4 回答 4

1

这看起来像一个伪逆。您是否正在寻找只是

h = X \ y;
于 2013-03-13T00:59:52.723 回答
0

我生成了一个随机的 10,000 x 10,000 矩阵 X 和一个随机的 10,000 x 1 向量 y。

我只是一步一步地分解了我的计算。(代码如下所示)

  1. 计算转置并将其保存在矩阵 K 中
  2. 然后我通过将 K 乘以 X 来计算矩阵 A
  3. 通过将 K 乘以向量 y 来计算向量 b
  4. 最后,我在 A 和 b 上使用了反斜杠运算符来解决

我的计算没有问题。这需要一段时间,但将操作分解为尽可能小的组有助于防止计算机不堪重负。但是,它可能是您正在使用的矩阵的组合(即稀疏、小数等)。

X = randi(2000, [10000, 10000]);
y = randi(2000, 10000, 1);
K = X';
A = K*X;
b = K*y;
S = A\b;
于 2013-03-13T00:07:12.053 回答
0

如果您有多台机器可供使用,并且您可以将问题重新转换h = X\y为@Ben 提出的形式,那么您可以使用分布式数组。这个演示展示了如何做到这一点。

于 2013-03-13T08:22:03.223 回答
0

乔丹,你的方程正是“摩尔-彭罗斯矩阵逆”的定义。

检查: http: //mathworld.wolfram.com/Moore-PenroseMatrixInverse.html

直接使用h = X \ y;应该会有所帮助。或者查看 Matlabpinv(X)*y

于 2013-06-24T21:42:45.050 回答