Представим, что kNN отнес новую точку к некоторому классу. Пусть для простоты это будет 1-NN, в котором решение базируется на одном ближайшем соседе. Возьмем точку и двух кандидатов:
из класса A и
из класса B. Расстояние до
около 0.92, до
около 1.72. Наименьшее расстояние выбрано, ответ получен. Однако знакомая схема скрывает интересную недосказанность. Какие именно признаки сделали A ближе? Возможно, почти всю разницу дал сигнал от одной координаты, возможно это вклад весьма конкретного набора координат, который можно интерпретировать как устойчивый признак более высокого порядка, а может, эти вклады распределены почти равномерно?
Аналогичный вопрос возникает и в кластеризации, например, при использовании k‑means. Алгоритм относит точку к ближайшему центру кластера. Но почему определенная точка попадает именно в свой кластер? Какие признаки на это влияют в большей мере?
На самом деле ответить на вопросы выше довольно легко. Для этого достаточно сохранить слагаемые, из которых получилось расстояние, перед тем, как «затирать» их суммированием.

Разложение манхэттенского и евклидового расстояния
Пусть у нас есть два вектора признаков, и
. С разложением манхэттенского расстояния на слагаемые никаких проблем не возникает:
Каждый модуль суммы и является абсолютным вкладом координаты в расстояние. Иногда для сравнения долей нужен относительный вклад, который можно получить делением вклада по координате на целое расстояние:
Для квадрата евклидова расстояния картина похожая. При поиске ближайшего соседа корень можно опустить, так как он не меняет порядок расстояний и соседства.
Обычный k‑means минимизирует именно сумму таких квадратов до центров кластеров. Вклад координаты равен ее квадрату разности, и эти вклады складываются в квадрат расстояния:
Формулы выше помогают разложить расстояние между двумя объектами. В нашем примере для 1-NN квадраты расстояний от до
и
равны 0.85 и 2.96. Разница 2.11 складывается из 1.47 по первой координате и 0.64 по второй. Обе поддерживают выбор
.
Теперь рассмотрим центроиды и
, найденные k‑means. Компонент суммы
говорит, насколько признак
раздвинул сами центры. Если интересует, какие признаки внесли больший вклад в то, что точка
попала в кластер
, сравниваем расстояния от нее до обоих центров уже по такой формуле:
Положительные слагаемые тянут точку в кластер , а отрицательные — в кластер
. Эти два варианта разложения стоит рассматривать отдельно.
import numpy as np q = np.array([0.1, 0.0]) neighbor_a = np.array([-0.6, -0.6]) neighbor_b = np.array([1.5, 1.0]) center_a = np.array([-1.4, -0.85]) center_b = np.array([1.775, 1.35]) for_neighbors = (q - neighbor_b) ** 2 - (q - neighbor_a) ** 2 between_centers = (center_a - center_b) ** 2 for_this_point = (q - center_b) ** 2 - (q - center_a) ** 2 print("1-NN:", np.round(for_neighbors, 2), round(for_neighbors.sum(), 2)) print("Центры:", np.round(between_centers, 2), round(between_centers.sum(), 2)) print("Точка и центры:", np.round(for_this_point, 2), round(for_this_point.sum(), 2))
Как быть с косинусным расстоянием?
Косинусное расстояние очень популярно и особенно эффективно в задачах, связанных с текстами и естественным языком. Можно ли также выделить компоненты из него? Да, только сначала разделим каждый вектор на его длину: ,
. После этого косинусное расстояние примет компактный вид:
Единицу в начале, как константу, можно убрать так как она сокращается при сравнении расстояний и не влияет на соседства точек. Тогда, по принципу, показанному ранее, вклад признака в косинусное расстояние можно записать как . Если сложить такие вклады, получится:
Положительное , возникающее, когда у координат разные знаки, увеличивает расстояние, отрицательное, наоборот, уменьшает.
Что делать с другими мерами расстояния и где это можно применить?
Рассмотрим «мешок слов», классический для NLP способ представления текста. Каждому слову из общего словаря соответствует координата. В нее можно записать число употреблений, относительную частоту слова TF или вес TF‑IDF, который учитывает также распространенность слова в других документах. Наглядное объяснение с примерами кода есть в обзоре способов векторизации текста на Хабре.
На этих подходах построена одна из идей стилометрии, дисциплины цифровых гуманитарных наук (Digital Humanities), изучающей способы определения авторства анонимных текстов. Это может быть полезно как при атрибуции художественных произведений, так и в криминалистике, когда нужно определить написано ли завещание или какой‑то иной важный документ определенным человеком. Известный пример стилометрической атрибуции связан с романом «Зов кукушки», опубликованным под именем Роберта Гэлбрейта. Получив подсказку о возможном авторе, журналисты попросили исследователей сравнить роман с книгами Дж. К. Роулинг и других писателей. Стилометрический анализ указал на Роулинг как на самого вероятного автора среди проверенных кандидатов, что, в итоге, оказалось правдой.
Начнем с классической для стилометрии Delta Берроуза. Берем общий словарь из слов и для каждого текста считаем относительную частоту каждого слова. Относительную, чтобы длинный роман не получал большие координаты просто из‑за числа страниц. Затем частоты стандартизируем:
где обозначает относительную частоту слова
в тексте
, а
и
считаются по корпусу текстов. Значение
показывает, насколько употребление слова в этом тексте отклоняется от корпусной нормы в единицах стандартного отклонения. У частотного «и» и менее частотного «давеча» теперь сопоставимый масштаб.
Дальше мы уже знаем, что делать. Берем манхэттенское расстояние между двумя ‑векторами и делим его на число слов.
Здесь вклад слова виден сразу: . Сложим вклады всех слов и получим Delta Берроуза. Если слово у двух авторов отклоняется от корпусной нормы по‑разному, его вклад будет большим.
Манхэттенское расстояние можно заменить. Евклидова Delta, например, сначала складывает , затем берет корень. Крупные расхождения по отдельным словам влияют на нее сильнее. Cosine Delta сравнивает направления векторов частотных профилей. Ее знаковые вклады
мы разобрали выше.
Для Jensen‑Shannon Delta профили нужно подготовить иначе. Берем неотрицательные частоты, делим частоту каждого слова на его корпусное стандартное отклонение и нормируем полученный вектор до суммы 1. Получаются два распределения весов слов, и
. Вклад слова в расхождение Йенсена‑Шеннона равен
Сумма этих неотрицательных вкладов дает полное расхождение.
Более сложный Rank‑Turbulence Delta основан на работе Питера Доддса и соавторов. Здесь сравниваются ранги слов в частотных списках двух профилей. Например, слово может занимать 10-е место у одного автора и 100-е у другого. Это изменение ранга даст ему вклад в общее расхождение. Общая величина снова складывается из вкладов отдельных слов.
Посмотрим, что получается на настоящих текстах. В исследовании мы усреднили профили произведений Ф. М. Достоевского и Л. Н. Толстого, затем посчитали расстояние между двумя авторскими профилями четырьмя способами.

Видно, что Дельта Берроуза (по сути манхэттенское расстояние) и Йенсен‑Шеннон работают очень схоже, а в косинусе расстояние порождается несколько иными словами. В Rank‑Turbulence наверх выходят в том числе «и» и «на». Мы видим, на какие различия «обращает внимание» каждая мера, что позволяет глубже понять ее работу и осознаннее выбрать способ сравнения текстов.
В случае стилометрии, если неизвестный текст оказался ближе к автору A, чем к автору B, исследователь может посмотреть, чем обеспечен перевес. Это могут быть особенности словоупотребления, частотные служебные слова, а при работе с сочетаниями слов и устойчивые обороты.
Разложение помогает и при верификации результата. Найденные слова можно найти в самих текстах, изучив контексты употребления. Связаны ли эти слова с манерой автора или, например, с сюжетом конкретной книги? Так цифровой филолог может точнее связывать численное различие со стилистическими особенностями автора. В отдельной проверке на 31 тексте мы увеличили словарь с 3000 до 3200 слов: для Delta Берроуза пересечение топ-30 вкладов по коэффициенту Жаккара составило 0.875. Затем обнулили 50 слов с наибольшими вкладами и пересчитали расстояние между авторскими профилями: оно снизилось с 0.429 до 0.394. Этот эксперимент позволяет оценить стабильность самого результата и понять, создается ли он несколькими неустойчивыми признаками или это влияние большого количества координат.
Вот так простое покомпонентное разложение превращает ответ в проверяемый и воспроизводимый список слов. По нему можно увидеть языковые привычки авторов, проследить логику работы самой меры расстояния, найти возможные помехи и выбрать фрагменты для внимательного чтения.
Подробные формулы и эксперименты приведены в нашей статье о Rank‑Turbulence Delta, опубликованной в Digital Scholarship in the Humanities, а код и данные лежат в репозитории.