2014-10-15 2 views
7

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

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

Это использует Гауэр метрику, чтобы иметь дело с номинальным переменным. Есть ли эквивалент Python функции daisy() в R?

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

ответ

4

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

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

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

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

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

+1

Спасибо, вы знаете, любой из метрик коробки расстояния, доступных в scikitlearn, которые могут совместно иметь дело с категорическими и числовыми переменными? – Rhubarb

+1

Я этого не делаю. Их документация хороша, поэтому поиск должен быстро выявлять результаты, если он существует. Однако мой подход состоял бы в том, чтобы определить мою собственную небольшую дистанционную функцию, которая обрабатывала это, как я хотел, и передать это на 'pdist'. Таким образом, я мог бы контролировать относительную важность различных аспектов этого расчета.Если бы это стало медленным, я бы либо использовал numba, либо Cython, чтобы нацелить реализацию этой функции на более низком уровне, чтобы ускорить ее. – ely

4

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

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

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

Результаты, полученные с этим до сих пор, совпадают с функцией Rais daisy.

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

 Смежные вопросы

  • Нет связанных вопросов^_^