Я собираюсь кластеризовать векторы документов из doc2vec, используя HDBSCAN.Я хочу найти крошечные кластеры, в которых есть семантические и текстовые дубликаты.
Для этого я использую gensim для генерации векторов документов.Все элементы полученных docvecs находятся в диапазоне [-1,1].
Чтобы сравнить два документа, я хочу сравнить угловое сходство.Я делаю это, вычисляя косинусное сходство векторов, которое отлично работает.
Но для кластеризации документов в HDBSCAN требуется матрица расстояний, а не матрица сходства.Нативное преобразование из косинусного сходства в косинусное расстояние в sklearn
равно 1-similarity
.Однако, насколько я понимаю, использование этой формулы может нарушить неравенство треугольника, не позволяя ему стать истинной метрикой расстояния.При поиске и просмотре кода других людей для похожих задач кажется, что большинство людей, похоже, используют sklearn.metrics.pairwise.pairwise_distances(data, metric='cosine')
, который в любом случае определяет косинусное расстояние как 1-similarity
.Похоже, что это дает соответствующие результаты.
Мне интересно, если это правильно, или я должен вместо этого использовать угловое расстояние, рассчитанное как np.arccos(cosine similarity)/pi
.Я также видел, как люди использовали евклидово расстояние на l2-нормализованных векторах документов;это похоже на косинусное сходство.
Пожалуйста, дайте мне знать, какой метод расчета расстояния между векторами документов для кластеризации является наиболее подходящим:)