1

線形システムの大規模なセット(50,000)を(最小二乗の意味で)解く必要があります。そのような各「システム」はAx=BAN行K列の行列でxあり、k行1列のベクトルであり、B(明らかに)はN行1列のベクトルです。(私の場合、Nは50,000、Kは〜10です)。

numpy.linalg.lstsqは当然の選択のようですが、ドキュメントには実装の詳細が含まれていないため、メモリと実行時のパフォーマンスについて疑問に思っています。

lstsqの実行時のパフォーマンスとメモリの要件は何ですか?

  1. A、A ^ Tを計算し、それらを乗算して逆行列を取りますか、それともAの疑似逆行列を直接計算しますか?
  2. 結果の各X[i]を直接計算して、メモリを節約する方法はありますか?使用しますか?
4

1 に答える 1

5

ドキュメントでは、結果が特異値とランクを含むものとして説明されています。SVDを使用しているという強いヒント。

私のラップトップでの簡単なテストでは、アレイAとBの割り当て後、メモリがまったく増加していないことが示されています(システムモニターによって報告されています)。

In [7]: A = np.random.randn(100000, 10)

In [8]: B = np.random.randn(100000)

In [9]: np.linalg.lstsq(A, B)
Out[9]: 
(array([ 0.00240061,  0.0017896 ,  0.00619928,  0.00010278, -0.00411501,
         0.00028532,  0.0003893 , -0.00042893,  0.00178326, -0.00444068]),
 array([ 99695.18278372]),
 10,
 array([ 318.37776275,  318.16578799,  317.82872616,  317.21981114,
         316.80987468,  315.63798002,  315.46574698,  314.73120345,
         313.99948001,  313.61503118]))
于 2012-12-08T11:36:18.910 に答える