一連のドキュメントから概念を抽出するには、行列の SVD 形式を使用する必要があります。私の行列は、A = [d1, d2, d3 ... dN]
がコンポーネントdi
のバイナリ ベクトルの形式M
です。次に、svd 分解により、特異値svd(A) = U x S x V'
が含まれるようになります。S
私はSVDLIBCを使用してnodejsで処理を行います(それを使用するために書いた小さなモジュールを使用します)。すべてうまく機能しているように見えましたが、マトリックスの状態に応じて、実行時の動作に非常に奇妙なことに気付きました (N、M は成長していますが、それぞれがすでに 1000 を超えています)。最初は、同じドキュメント ベクトルを抽出することを考慮していませんでしたが、いくつかのテストの結果、ドキュメントを 2 回追加すると、処理が異常に速くなる場合があるようです。
- A の各列が対独立であることを確認する必要がありますか? それらはすべて線形独立である必要がありますか? (いや、SVDは一部の列がまったく同じであってもうまく機能しているように見えるので、
U
orに0のコンポーネントを含めることで、結果の分解でどの列/行が役に立たないかを単純に示すだけだと思いましたV
) - 大きな行列の SVD を計算するのに時間がかかりすぎることがあるので、同じ列を削除してサイズを縮小しようとしましたが、実際にダミーの同じベクトルを追加すると、はるかに高速になることがわかりました。それは正常ですか?何が起こっていますか?
論理的には、マトリックスにできるだけ多くの情報を含めたいと思います。
- [A] 同じ列をすべて削除します。
- [B] 線形従属列を削除します。
[A] を実行するのは非常に簡単で、計算コストもそれほど高くないように思えます。作成時にベクトルをハッシュして、同じベクトルである可能性があるものを確認し、時間をかけてこれらを確認することもできますが、[A] と [B] の適切な計算手法はありますか? ]?
([A]が過去のベクトル全体との新しいベクトルの同等性を総当りの方法でチェックする必要がないことを感謝します.[B]については、それをチェックする良い方法がわかりません/行うそれ)。
関連する質問を追加: 私の 2 番目の質問について、類似の列を 1 つ追加するだけで SVD の実行時の動作が大幅に変わるのはなぜですか? これは正常に起こりうる動作ですか、それとも SVDLIBC のバグを探す必要があるということですか?