sklearn からの潜在的ディリクレ割り当てを異常検出に使用したいと考えています。式hereで正式に説明されているように、新しいサンプルの可能性を取得する必要があります。
どうすればそれを手に入れることができますか?
sklearn からの潜在的ディリクレ割り当てを異常検出に使用したいと考えています。式hereで正式に説明されているように、新しいサンプルの可能性を取得する必要があります。
どうすればそれを手に入れることができますか?
渡されたドキュメントの対数尤度を返すモデルのscore()メソッドを使用する必要があります。
論文に従ってドキュメントを作成し、ホストごとに LDA モデルをトレーニングしたと仮定します。次に、すべてのトレーニング ドキュメントから最も低い可能性を取得し、それをしきい値として使用する必要があります。テストされていないコードの例は次のとおりです。
import numpy as np
from sklearn.decomposition import LatentDirichletAllocation
# Assuming X contains a host's training documents
# and X_unknown contains the test documents
lda = LatentDirichletAllocation(... parameters here ...)
lda.fit(X)
threshold = min([lda.score([x]) for x in X])
attacks = [
i for i, x in enumerate(X_unknown)
if lda.score([x]) < threshold
]
# attacks now contains the indexes of the anomalies
リンクした論文で正確な方程式を使用したい場合は、期待ステップのインターフェースが明確ではないため、scikit-learn でそれを実行しないことをお勧めします。
パラメータθおよびφは、およびとして行112 ~ 130で見つけることができます。この関数は、doc_topic_distribution と、次のテストされていないコードによってθとφを推測できる十分な統計を返します。doc_topic_d
norm_phi
_update_doc_distribution()
theta = doc_topic_d / doc_topic_d.sum()
# see the variables exp_doc_topic_d in the source code
# in the function _update_doc_distribution()
phi = np.dot(exp_doc_topic_d, exp_topic_word_d) + EPS
期待値と最大化のステップ、および変分パラメーターをさらに制御したい場合は、LDA++、特にEStepInterfaceを確認することをお勧めします(免責事項、私は LDA++ の作成者の 1 人です)。