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

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

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

При этом используется показатель gower для работы с номинальными переменными. Есть ли Python-эквивалент daisy() функция в R?

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

2 ответа

Решение

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

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

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

Для кластеризации в Python, как правило, вы хотите работать с scikits.learn, и на этой странице вопросов и ответов обсуждается именно эта проблема использования специальной меры расстояния (в вашем случае Gower) с scikits - что не представляется возможным.

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

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

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

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

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

Исходный код доступен в этой записной книжке Jupyter: https://sourceforge.net/projects/gower-distance-4python/files/

Другие вопросы по тегам