行列に1つの新しい行を追加した後のSVD分解の更新


17

Iが密行列があるとM × N個の SVD分解を伴う大きさ、A = U S Vをでは、次のようにSVDを計算できます。Am×n

A=USV.
Rsvd(A)

新しい番目の行がAに追加され場合、SVDをゼロから再計算せずに、古いものに基づいて(つまりUS、およびVを使用して)新しいSVD分解を計算できますか?(m+1)AUSV


3
の文献を確認してくださいrank 1 updates。ブランドによる軽量推奨システムの高速オンラインSVDリビジョンは、アクセス可能な最初の論文です。残念ながら、Rに既に実装されているSVDの何かを見たことはありません。CHOLMODのおかげで、コレスキーの更新が存在します(updownからMatrix)。マトリックスのスパース性は、最終的なソリューションとは実際に異なります。密行列または疎行列を想定していますか?A
usεr11852が復活モニック言う

2
+1から@usεr11852。また、QRの更新ははるかに簡単で標準的なものであり、一部のアプリケーションではQRで十分であり、SVDを実際に必要としないことにも注意してください。アプリケーションも考えてください。
アメーバは、モニカーを復活させる

はい、マトリックスは密です。
user1436187

1
次に、推奨文献を「捨て」、画像処理に焦点を合わせます。ツアーに関する同様の質問が、データベースの「新しい画像」に関して投稿されています。たとえば、私の予想では、誰かがオンラインで固有顔のエントリを更新するためのアルゴリズムを持っている必要があります。これらの人は、密な行列表現で動作します。
usεr11852が復活モニック言う

回答:


14

はい、既存のマトリックスに新しい行を1つ追加した後、SVD分解を更新できます。

A

A=AuvT

uv

A=AUVT

ウッドベリーの式が場に出ます。これらの式を見ると、多くの逆関数が関係していることに気付くでしょう。これらを直接解決しません。すでに多くのサブシステムをすでに解決しているので(つまり、既にいくつかの分解を計算しているので)、これらを利用して、より高速および/またはより安定した推定を取得します。(だから人々はまだこの分野を研究している。)私はJE Gentleの著書 " Computational Statistics "を参考としてたくさん使ってきた。チャプトだと思う。5 数値線形代数は適切に設定します。(超古典的:Harvilleによる統計学者の視点からのマトリックス代数」は、不運にもランクの更新にはまったく触れていません。)

統計/アプリケーションの側面を見ると、新しいユーザーが登録または新しい製品が登録されるたびに何千もの顧客エントリがあり、SVD(または特定の分解)を再計算する可能性があるため、推奨システムではランク1の更新が一般的です追加または削除は非常に無駄です(達成できない場合)。通常、推奨システムマトリックスはスパースであり、これによりアルゴリズムがさらに効率的になります。アクセシブルな最初の論文は、M。Brandによる「軽量推薦システムのための高速オンラインSVD改訂」原稿です。密な行列に行くパターン認識と画像処理からの論文を見ると、実際のアルゴリズムを使用するのにかなり遠くなると思います。たとえば、論文:

  1. RenおよびDaiによる顔認識(2009)の双方向主成分の増分学習
  2. Liらによる漸進的かつ堅牢な部分空間学習(2003)
  3. 順次Karhunen-Loeve基底抽出とその画像への適用(2000)( LeveyおよびLindenbaumによる)。
  4. Ross et al。によるロバストな視覚追跡のための増分学習(2007)

すべてがコアで同じ問題に取り組んでいるようです。新しい機能が入ってきており、それに応じて表現を迅速に更新する必要があります。これらの行列は対称または正方形ではないことに注意してください。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実装のラッパーです。


6
これはいい解説ですが、質問に対する答えが見つからないことに失望しました。これは、ことが判明したマシュー・ブランド別別の紙 MOの答えからリンクは、明示的なソリューションが含まれています。
whuber

5
あなたと@whuberの両方に+1(そして、別のSEサイトで提供される情報を「複製」することは避けるべきではないと思います!このサイトで提供される情報を自立したものにしようとするべきだと主張します実際、ここに含まれるほとんどすべての情報は、ある意味で、既存の教科書、オンラインリソース、または研究論文を複製しています。1つの質問:ランク1またはより高いランクの更新後にマトリックスの逆数がどのように変化するかを記述するSherman-MorrisonおよびWoodburyの式について言及しました。彼らはSVDと何をしなければなりませんか?
アメーバは、モニカを復活させる

1
そのリンクのMOページに人々を誘導したい理由を理解していますが、問題を解決することを直接述べることを検討するかもしれません!(「良い最初のステップ」は、控えめな表現です。)あなたの解説の多くは、まだ良い解決策が見つかっていないことを示していると誤解されることがあります。
whuber

1
@whuber:「良い」は「素晴らしい」になりました、そして今、私も論文を述べました、より良いですか?:)(ちなみにフィードバックをありがとう。)
usεr11852によると、Reinstate Monic

2
歴史のためだけに:BunchとNielsenは、SVDを更新およびダウンデートする方法を初めて実証しました。事実上、ブランドの方法は、この古い論文の方法を一般化します。
JMは統計家ではありません
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.