次のように用語文書行列(TD)から計算される共起行列(C)の因子分析を実行しようとしています: C=TD*TD'
理論的には C は正の半正定値である必要がありますが、そうではなく、因数分解アルゴリズムはこのため動作しません。速度上の理由からアルゴリズムを変更できません)。
私はそれを調べて、それは数値安定性の問題かもしれません: 半正定行列を生成するための単純なアルゴリズム - 答え2.
ここで進める良い方法は何ですか?
次のように用語文書行列(TD)から計算される共起行列(C)の因子分析を実行しようとしています: C=TD*TD'
理論的には C は正の半正定値である必要がありますが、そうではなく、因数分解アルゴリズムはこのため動作しません。速度上の理由からアルゴリズムを変更できません)。
私はそれを調べて、それは数値安定性の問題かもしれません: 半正定行列を生成するための単純なアルゴリズム - 答え2.
ここで進める良い方法は何ですか?
行列の固有分解を行います。
C=Q D Q^-1
行列が正の半正定値である場合、すべての固有値 (D の対角要素) は非負でなければなりません。(これはおそらく、行列が正の半正定値であるかどうかを確認するために、因子分析アルゴリズムが同様に行っているテストです。)
数値の問題に苦しんでいる場合、固有値のいくつかはおそらくゼロよりわずかに小さいでしょう。これらのエントリをゼロに設定し、計算Q D Q^-1
して新しい修正された C を取得し、それを因子分析アルゴリズムに送信してみてください。
一方、行列 C の固有値が真に負であることがわかった場合は、C の構築のどこかで間違っていることがわかります。
コメントできないので、SplittingField のコメントをエコーする必要があります。C=TD*TD' の形成は TD の条件数の2 乗であり、2 倍ではありません。C の固有値分解を見つけることと同等で、より安定しているのは、TD で特異値分解 (SVD) を実行することです。おまけとして条件数を取得します。最大の特異値と最小の特異値の比が行列の条件数であり、その 10 を底とする対数は、失う可能性のある 10 進数の桁数の推定値です。計算で C を使用したことはあります (もちろん、最小の特異値が 0 の場合、問題は特異です!)
まず第一に、負の固有値を持つ行列の「病状」を修復するための手法があります。覚えておいてください、行列は一連の計算と、一般的に最初に病状をもたらすこれらのステップによって発生します。行列がゼロに近い小さな負の固有値を持つため、それが「悪い」行列であるという事実を受け入れるのは、実際には適切ではありません。むしろ、病理を修復するためにいくつかの作業を行ってください。SVD に関しては、それが優れたアプローチの 1 つであることに同意しますが、計算コストが非常に高いため、仕事ではあまり使用しません。ただし、ゼロの行列要素が 1 つ以上ある場合、つまり行列が疎の場合は、SVD を使用する必要があります。SVD が機能する唯一の方法の 1 つだからです。