Какова подходящая метрика расстояния при кластеризации векторов параграфа /doc2vec?
Я собираюсь кластеризовать векторы документов из 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-нормализованных векторах документов; это похоже на косинусное сходство.
Пожалуйста, дайте мне знать, что является наиболее подходящим методом для расчета расстояния между векторами документов для кластеризации:)
2 ответа
Я полагаю, что на практике используется косинусное расстояние, несмотря на то, что существуют угловые случаи, когда он не является надлежащей метрикой.
Вы упоминаете, что "все элементы получающихся документов находятся в диапазоне [-1,1]". Обычно это не гарантируется, хотя это было бы, если бы вы уже нормализовали все необработанные doc-векторы.
Если вы выполнили эту единичную нормализацию или хотите это сделать, то после такой нормализации евклидово расстояние всегда будет давать тот же порядок ранжирования ближайших соседей, что и косинусное расстояние. Абсолютные значения и относительные пропорции между ними будут немного отличаться, но все тесты "X ближе к Y, чем Z" будут идентичны тестам, основанным на косинусном расстоянии. Таким образом, качество кластеризации должно быть практически идентичным прямому использованию косинусного расстояния.
Надлежащая метрика подобия - это скалярное произведение, а не косинус.
Word2vec и т. Д. Обучаются с использованием скалярного произведения, не нормированного по длине вектора. И вы должны точно использовать то, что было обучено.
Люди используют косинус все время, потому что он хорошо работает для множества слов. Выбор не основан на правильном теоретическом анализе, насколько я знаю.
HDBSCAN не требует метрики. Преобразование 1-sim предполагает, что x ограничен 1, так что это не будет надежно работать.
Предлагаю попробовать следующие подходы:
- используйте отрицательные расстояния. Это может просто сработать. То есть d(x,y)=-(x точка y)
- использовать преобразование max-sim. Получив матрицу точечных произведений, легко получить максимальное значение.
- реализовать HDBSCAN* с подобием, а не метрикой