私の意図は、HDBSCAN を使用して doc2vec からドキュメント ベクトルをクラスター化することです。意味とテキストの重複がある小さなクラスターを見つけたいです。
これを行うために、gensim を使用してドキュメント ベクトルを生成しています。結果の docvec の要素はすべて [-1,1] の範囲にあります。
2 つのドキュメントを比較するには、角度の類似性を比較したいと考えています。ベクトルのコサイン類似度を計算することでこれを行いますが、これは正常に機能します。
ただし、ドキュメントをクラスター化するには、HDBSCAN は類似度マトリックスではなく、距離マトリックスを必要とします。でのコサイン類似度からコサイン距離へのネイティブ変換sklearn
は です1-similarity
。ただし、この式を使用すると、三角形の不等式が壊れて、真の距離メトリックでなくなる可能性があることを理解しています。同様のタスクのために他の人のコードを検索して見ると、ほとんどの人はとにかくsklearn.metrics.pairwise.pairwise_distances(data, metric='cosine')
コサイン距離を定義するものを使用しているよう1-similarity
です。適切な結果が得られているようです。
これが正しいかどうか、または として計算された角度距離を代わりに使用する必要があるかどうか疑問に思っていnp.arccos(cosine similarity)/pi
ます。また、l2 正規化されたドキュメント ベクトルでユークリッド距離を使用する人も見てきました。これは余弦類似度と同等のようです。
クラスタリング用のドキュメント ベクトル間の距離を計算するための最も適切な方法を教えてください :)