А как насчет этого очень хорошего ответа на CrossValidated?
Он использует распространение по сродству вместо k-средних, и в этом случае вы можете указать в качестве входных данных метрику расстояния. Я не думаю, что какой-либо подход, основанный на k-средних, мог бы работать в вашем случае, так как он основан на построении центроида и для этого вам нужно находиться в векторном пространстве.
Преимущество Affinity Propagation заключается в том, что он автоматически выбирает количество кластеров, которое можно настроить (иметь больше или меньше кластеров), изменив предпочтение (которое по умолчанию является медианой всех парных расстояний, но вы можете выбрать другое). процентили).
Если вам нужно указать точное количество кластеров, кроме настройки распространения по методам проб и ошибок, вы можете найти реализацию k-medoids (очевидно, что в sklearn его реализации нет, но люди просили об этом здесь и здесь ). K-medoids не строит центроиды, поэтому ему не нужно понятие векторного пространства. Таким образом, реализация может принять в качестве входных данных предварительно вычисленную матрицу расстояний (однако я не проверил ссылки, которые я даю).