Iが密行列があるとのM × N個の SVD分解を伴う大きさ、A = U S Vを ⊤。では、次のようにSVDを計算できます。
R
svd(A)
新しい番目の行がAに追加された場合、SVDをゼロから再計算せずに、古いものに基づいて(つまりU、S、およびVを使用して)新しいSVD分解を計算できますか?
Iが密行列があるとのM × N個の SVD分解を伴う大きさ、A = U S Vを ⊤。では、次のようにSVDを計算できます。
R
svd(A)
新しい番目の行がAに追加された場合、SVDをゼロから再計算せずに、古いものに基づいて(つまりU、S、およびVを使用して)新しいSVD分解を計算できますか?
回答:
はい、既存のマトリックスに新しい行を1つ追加した後、SVD分解を更新できます。
ウッドベリーの式が場に出ます。これらの式を見ると、多くの逆関数が関係していることに気付くでしょう。これらを直接解決しません。すでに多くのサブシステムをすでに解決しているので(つまり、既にいくつかの分解を計算しているので)、これらを利用して、より高速および/またはより安定した推定を取得します。(だから人々はまだこの分野を研究している。)私はJE Gentleの著書 " Computational Statistics "を参考としてたくさん使ってきた。チャプトだと思う。5 数値線形代数は適切に設定します。(超古典的:Harvilleによる「統計学者の視点からのマトリックス代数」は、不運にもランクの更新にはまったく触れていません。)
統計/アプリケーションの側面を見ると、新しいユーザーが登録または新しい製品が登録されるたびに何千もの顧客エントリがあり、SVD(または特定の分解)を再計算する可能性があるため、推奨システムではランク1の更新が一般的です追加または削除は非常に無駄です(達成できない場合)。通常、推奨システムマトリックスはスパースであり、これによりアルゴリズムがさらに効率的になります。アクセシブルな最初の論文は、M。Brandによる「軽量推薦システムのための高速オンラインSVD改訂」原稿です。密な行列に行くパターン認識と画像処理からの論文を見ると、実際のアルゴリズムを使用するのにかなり遠くなると思います。たとえば、論文:
すべてがコアで同じ問題に取り組んでいるようです。新しい機能が入ってきており、それに応じて表現を迅速に更新する必要があります。これらの行列は対称または正方形ではないことに注意してください。M. Brandの別の研究でもこの問題に対処できます(論文「Thin特異値分解の高速低ランク修正(2006)」-これは投稿の冒頭にあるMOリンクでも言及されています)。この主題に関する多くの素晴らしい論文がありますが、ほとんどは非常に数学的な傾向があります(例えば、「大きな長方形のランダム行列の低位摂動の特異値とベクトル」に関するBenaych-GeorgesaおよびNadakuditiの論文(2012)")そして、私は彼らがすぐに解決策を得るのを助けるとは思わない。私はあなたが画像処理の文献に焦点を合わせ続けることを勧める。
残念ながら、ランク1の更新ルーチンのR実装に遭遇したことはありません。Computational Science SEの「Python、C、またはFortranでの更新可能なSVD実装」の答えは、検討する必要のある多くのMATLABおよびC ++実装を提供します。通常、R、Pythonなどの実装は、C、C ++、またはFORTRAN実装のラッパーです。
rank 1 updates
。ブランドによる軽量推奨システムの高速オンラインSVDリビジョンは、アクセス可能な最初の論文です。残念ながら、Rに既に実装されているSVDの何かを見たことはありません。CHOLMODのおかげで、コレスキーの更新が存在します(updown
からMatrix
)。マトリックスのスパース性は、最終的なソリューションとは実際に異なります。密行列または疎行列を想定していますか?