2014-10-15 3 views
7

나는 범주 적 (명목상과 서수) 및 숫자 속성을 모두 포함하는 데이터 집합이 있습니다. 나는 이러한 혼합 된 속성을 사용하여 내 관측을 가로 지르는 (dis) 유사성 행렬을 계산하려고합니다. 다음과 같이 R의 클러스터 패키지의 daisy() 기능을 사용하여, 나는 쉽게 유사성 행렬을 얻을 수 있습니다 :파이썬에서 daisy()와 같은 클러스터 패키지 R

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

이는 명목 변수를 다루는 메트릭 GOWER을 사용합니다. R에 daisy() 함수와 동일한 파이썬이 있습니까?

또는 Gower 메트릭이나 유사한 것을 사용하여 다른 특성이 혼합 된 (공칭, 숫자) 속성이있는 데이터 집합의 (dis) 유사도 행렬을 계산할 수있게 할 수 있습니까?

답변

4

나는 당신이 scipy.spatial.distance.pdist을 찾고 있다고 생각합니다.

한 쌍의 관측치에서 Gower 거리를 계산하는 함수를 구현하면 해당 함수를 pdist에 전달할 수 있으며, 쌍으로 적용하여 쌍 거리의 결과 행렬을 반환합니다. Gower 거리는 기본 제공 옵션 중 하나라는 것은 아닙니다.

마찬가지로 단일 관찰에 혼합 속성이있는 경우 숫자 속성의 하위 집합에서 유클리드 거리와 같은 항목을 사용하고 카테고리 속성의 하위 집합에서 Gower 거리를 사용하는 함수를 정의 할 수 있습니다. 그들 - 또는 당신의 어플리케이션을 위해 두 가지 고립 된 관찰 사이의 거리를 계산하는 것이 무엇을 의미하는지에 대한 다른 구현.

파이썬 클러스터링의 경우 일반적으로 scikits.learnthis question and answer page은 사용자 정의 거리 측정 도구 (Gower의 경우)에 스코어를 사용하여이 문제를 정확하게 논의합니다. 이는 보이지 않습니다.

pdist에서 제공하는 선택 사항 중 하나를 링크 된 답변 페이지의 구현과 함께 사용하거나 Gower 유사성을위한 기능을 구현하여 사용할 수 있습니다. 그러나 즉시 사용할 수있는 클러스터링 도구를 scikits에서 원한다면 직접적으로 가능하지는 않습니다.

+1

감사합니다 :

소스 코드는이 jupyter 노트북에서 기한입니까? – Rhubarb

+1

나는 그렇지 않습니다. 그들의 문서화가 훌륭하기 때문에 검색을 통해 결과가 빨리 나타나야합니다. 그러나, 내 접근 방식은 내가 원했던 방식으로 이것을 처리 한 저 자신의 소소한 거리 함수를 정의하고 그것을 'pdist'에 전달하는 것입니다. 그렇게하면 계산의 다른 측면의 상대적인 중요성을 제어 할 수 있습니다.이 속도가 느린 경우 numba 또는 Cython을 사용하여 속도를 올리기 위해 낮은 수준에서 그 기능을 구현하는 것을 목표로 삼을 것입니다. – ely

4

그냥 Gower 함수를 구현하여 pdist와 함께 사용하면 충분하지 않습니다.

내부적으로 pdist는 혼합 된 데이터가있는 행렬을 사용할 경우 실패하는 여러 수치 변환을 수행합니다.

필자는 원래의 논문과 pdist 모듈에서 필요한 각각의 권고에 따라 Gower 함수를 구현했다. (나는 pdist 모듈의 def가 private이기 때문에 함수를 오버라이드 할 수 없다.)

내가 지금까지 얻은 결과는 R의 데이지 기능과 동일합니다. 당신은 공동 범주 및 숫자 변수를 처리 할 수 ​​scikitlearn에서 사용할 수있는 상자 거리 측정에서 어떤 알고 않습니다 https://sourceforge.net/projects/gower-distance-4python/files/