2014-10-15 41 views
7

Mam zestaw danych zawierający atrybuty kategoryczne (nominalne i porządkowe) i liczbowe. Chcę obliczyć macierz podobieństwa (dis) w moich obserwacjach, używając tych mieszanych atrybutów. Korzystanie z funkcji daisy() pakietu klastrów w zakresie badań, mogę łatwo dostać matrycę odmienność następująco:Pythonowy odpowiednik daisy() w pakiecie klastra z R

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

używa Gower metryczną do czynienia ze zmiennymi nominalnymi. Czy istnieje odpowiednik w języku Python funkcji daisy() w R?

A może jakakolwiek inna funkcja modułu, która umożliwia użycie metryki Gower lub coś podobnego do obliczenia macierzy podobieństwa (dis) dla zbioru danych o mieszanych (nominalnych, numerycznych) atrybutach?

Odpowiedz

4

Uważam, że szukasz scipy.spatial.distance.pdist.

Jeśli zaimplementujesz funkcję, która oblicza odległość Gowera na pojedynczej parze obserwacji, możesz przekazać tę funkcję do pdist i zastosuje ją parami i zwróci wynikową macierz odległości par. Nie wydaje się, że odległość Gower jest jedną z wbudowanych opcji.

Podobnie, jeśli pojedyncza obserwacja ma mieszane atrybuty, można po prostu zdefiniować własną funkcję, która, powiedzmy, używa czegoś takiego jak odległość euklidesowa w podzbiorze atrybutów liczbowych, odległość Gowera w podzbiorze atrybutów jakościowych i dodaje ich - lub jakiejkolwiek innej implementacji tego, co dla ciebie oznacza, dla twojego zastosowania, do obliczenia odległości między dwiema odosobnionymi obserwacjami.

Do łączenia w klastry w Pythonie zazwyczaj chce się pracować z scikits.learn i this question and answer page omawia dokładnie ten problem użycia niestandardowej miary odległości (w twoim przypadku Gower) z scikitami - co nie wydaje się możliwe.

Możesz użyć jednej z opcji dostarczonych przez pdist wraz z implementacją na tej połączonej stronie odpowiedzi - lub możesz zaimplementować funkcję podobieństwa Gower i użyć jej. Ale jeśli chcesz mieć gotowe narzędzia do grupowania z scikitów, nie wydaje ci się to możliwe.

+1

dziękuję, wiesz któregokolwiek z metryki odległości box dostępnych w scikit-learn, które mogą wspólnie zajmują się zmiennych kategorycznych i liczbowych? – Rhubarb

+1

Ja nie. Ich dokumentacja jest dobra, więc wyszukiwanie powinno szybko ujawnić wyniki, jeśli istnieje. Jednak moim podejściem byłoby zdefiniowanie mojej własnej małej funkcji odległości, która obsłużyła to, jak chciałem, i przekazanie tego do 'pdist'. W ten sposób mógłbym kontrolować względne znaczenie różnych aspektów tego obliczenia.Jeśli stało się to wolniejsze, użyłbym numby lub Cythona, by skierować implementację właśnie tej funkcji na niższym poziomie, aby przyspieszyć działanie. – ely

4

Samo wdrożenie funkcji Gower do użycia z pdistem nie wystarczy.

Wewnętrznie pdist dokonuje kilku transformacji liczbowych, które zawiedzie, jeśli używasz macierzy z mieszanymi danymi.

Zaimplementowałem funkcję Gower, zgodnie z oryginalnym dokumentem i odpowiednie adptacje niezbędne w module pdist (nie mogłem po prostu zastąpić funkcji, ponieważ defs w module pdist są prywatne).

Wyniki uzyskane z tym do tej pory są takie same z funkcji Daisy R.

Kod źródłowy jest dostępny podczas tej jupyter Notebook: https://sourceforge.net/projects/gower-distance-4python/files/