Python-эквивалент daisy () в кластерном пакете R

у меня есть набор данных, который содержит как категориальные (номинальные и порядковые) и числовых атрибутов. Я хочу вычислить матрицу подобия (dis) по моим наблюдениям, используя эти смешанные атрибуты. С помощью Маргаритка() функция пакета кластера в R, я могу легко получить матрицу несходства следующим образом:

if(!require("cluster")) { install.packages("cluster");  require("cluster") }
data(flower)
as.matrix(daisy(flower, metric = "gower"))

для работы с номинальными переменными используется метрика gower. есть ли эквивалент Python

2 ответов


Я считаю, что вы ищете scipy.spatial.distance.pdist.

Если вы реализуете функцию, которая вычисляет расстояние Гауэра на одной паре наблюдений, вы можете передать эту функцию pdist и он применит его попарно и вернет результирующую матрицу попарных расстояний. Не похоже, что расстояние Gower является одним из встроенных параметров.

аналогично, если одно наблюдение имеет смешанные атрибуты, вы можете просто определить свою собственную функцию, которая, скажем, использует что-то вроде евклидова расстояния на подмножестве числовых атрибутов, расстояние Гауэра на подмножестве категориальных атрибутов и добавляет их-или любую другую реализацию того, что это значит для вашего приложения, чтобы вычислить расстояние между двумя изолированными наблюдениями.

для кластеризации в Python обычно вы хотите работать с scikits.учись!--5--> и этот вопрос и ответ на стр. обсуждает именно эту проблему использования пользовательское измерение расстояния (в вашем случае Gower) с помощью scikits-что кажется невозможным.

вы можете использовать один из вариантов, предусмотренных pdist вместе с реализацией на этой связанной странице ответов - или вы можете реализовать функцию для сходства Gower и использовать ее. Но если вам нужны готовые инструменты кластеризации из scikits, это не представляется возможным напрямую.


просто реализовать функцию Gower для использования с pdist будет недостаточно.

внутренне pdist делает несколько числовых преобразований, которые потерпят неудачу, если вы используете матрицу со смешанными данными.

я реализовал функцию Gower, согласно оригинальной статье, и соответствующие adptations, необходимые в модуле pdist (я не мог просто переопределить функции, потому что defs в модуле pdist являются частными).

результаты, которые я получил с этим до сих пор то же самое от функции RS daisy.

исходный код доступен в этом ноутбуке jupyter: https://sourceforge.net/projects/gower-distance-4python/files/