입력에서 사용자 정의 거리 행렬을 사용한 k- 평균 구현


14

누구든지 입력에서 거리 행렬을 취할 수있는 k- 평균 구현을 지적 할 수 있습니까? 표준 MATLAB 구현에는 입력에 관찰 행렬이 필요하며 유사성 측정 값을 사용자 정의로 변경할 수 없습니다.


2
유클리드 거리의 행렬에 해당하는 원시 데이터를 생성하여 K-Means에 입력 할 수 있습니다. 대안적인 쉬운 접근 방법은 행렬의 계층 적 군집 방식의 Ward 방법을 사용하는 것일 수 있습니다. K-Means와 Ward는 군집과 비슷한 이념을 공유합니다.
ttnphns


Matlab은 아니지만 is-it-possible-to-as-species-your-distance-function-using-scikits-learn-k-means 아래의 파이썬 페이지는 scipy.spatial의 20 홀수 메트릭을 사용할 수 있습니다. 거리.
데니스

답변:


13

k- 평균 은 군집하려는 점의 여러 하위 집합의 평균 을 찾을 수 있어야 하므로 거리 행렬을 입력으로 사용하는 k- 평균 버전을 요청하는 것은 의미가 없습니다.

대신 k-medoids 를 사용해보십시오 . 있습니다 어떤 matlab에 구현 가능.


1
안녕, 답변 주셔서 감사합니다; 거리 매트릭스를 직접 제공하는 대신 사용자 정의 거리 메트릭을 입력으로 제공 할 수 있습니까? 요점은 두 개의 클러스터링 방법을 비교해야한다는 것입니다. 두 번째 방법에서는 사용자 지정 유사성 매트릭스를 사용하기 때문에 공정한 비교를 위해 kmeans와 동일한 접근 방식을 사용하고 싶습니다.
Eugenio 2016 년

2
ELKI를 사용하면 k- 평균과 함께 임의의 거리 기능을 사용할 수 있습니다. 그러면 알고리즘이 수렴하지 못할 수 있습니다. K- 평균은 실제로 제곱 유클리드 거리 (제곱의 합)를 위해 설계되었습니다 . 다른 거리에서는 평균 이 더 이상 최적화되지 않으며 알고리즘이 결국 수렴되지 않습니다. k- 메도 이드 사용을 고려하십시오. 실제로는 비거리 와 함께 k- 평균 아이디어를 사용할 수 있도록 작성되었습니다 .
Quit--Anony-Mousse를 가지고 있습니다

python / C ++ 라이브러리를 사용하여 커스텀 메트릭 기능을 제공 할 수 있습니다 : github.com/annoviko/pyclustering/issues/417
CpILL

8

거리 행렬을 원시 데이터로 변환하고이를 K- 평균 군집화에 입력 할 수 있습니다. 단계는 다음과 같습니다.

1) N 점 사이의 거리는 유클리드의 제곱이어야합니다. 행렬의 " 이중 중심화 "를 수행합니다 . 각 요소의 행 평균 빼기; 결과에서 각 요소의 빼기 열 평균; 결과적으로 각 요소에 행렬 평균을 추가하십시오. 빼기 2로 나눕니다. 이제 가지고있는 행렬은 점 사이의 SSCP (제곱합과 교차 곱) 행렬입니다. 여기서 원점은 N 점 구름의 기하학적 중심에 놓입니다. (이중 센터링에 대한 설명은 여기를 참조하십시오 .)

2) 해당 매트릭스에서 PCA (Principal Component Analysis)를 수행하고 NxN 컴포넌트 로딩 매트릭스를 얻습니다 . 마지막 열 중 일부는 모두 0 일 가능성이 있으므로 잘라냅니다. 지금 당신이 유지하는 것은 실제로 주성분 점수, 즉 구름을 통해 축으로 통과하는 주성분에 대한 N 점의 좌표입니다. 이 데이터는 K- 평균 입력에 적합한 원시 데이터로 처리 될 수 있습니다.

PS 거리가 기하학적으로 올바른 제곱 유클리드 거리가 아닌 경우 문제가 발생할 수 있습니다. SSCP 매트릭스는 양 (반) 정확하지 않을 수 있습니다. 이 문제는 여러 가지 방법으로 해결할 수 있지만 정밀도가 떨어집니다.


답변 주셔서 감사합니다! 실제로 나는 실제 거리 매트릭스가 없지만 객체 간 유사성 매트릭스 (0 ... 1)를 가지고 있으며 유사성은 유클리드 거리를 사용하여 정확하게 계산되지 않지만 원시 데이터를 고려하지만 사용자 정의 알고리즘을 사용하여 사용자 정의 알고리즘을 사용합니다. 표준 방법. 이 경우에는 절차를 적용 할 수 없습니다. 맞습니까?
Eugenio

유사성을 거리로 변환 한 후에도 여전히 할 수 있습니다. 후자는 아마도 유클리드가 아닐 것이다 (따라서 SSCP는 음의 고유 값을 가질 것이다). 그런 다음 SSCP가 부정을 잃을 때까지 거리에 작은 상수를 추가하십시오. eig. 이 문제를 해결하는 다른 방법도 있습니다. 그리고 제곱 거리 의 이중 중심 행렬을 기억하십시오 .
ttnphns

추신. 그리고 그건 그렇고. 행렬이 유사하다면 더 좋습니다. 내가 말한 SSCP 매트릭스로 취급하고 PCA를 사용합니다. 여전히 음의 고유 값에 대한 문제는 여전히 남아 있습니다.
ttnphns

@ttnphns, I는 1 단계에 대한 거리 행렬을 당신의 설명을 잃었 미안 X때문에, 대칭 될 것입니다 (하자가 N * N 말) colMeans(X) =rowMeans(X) : 당신 빼기 행 또는 COL 수단 번 Y=X-rowMeans(X), mean(Y)0입니다
Zhubarb

1
@Zhubarb, 말할 때 You could turn your matrix of distances into raw data(1 및 2 지점) 본질적으로 이중 센터링이 초기 단계 인 Torgerson의 다차원 스케일링 (MDS)말합니다 . 해당 절차에 대해이 사이트 (및 Google)를 검색하십시오. "이중 중심화"는 점의 구름의 중심에 놓은 원점에 대해 정의 된 해당 스칼라 곱 행렬로 (제곱) 거리를 변환하는 것입니다.
ttnphns

3

내 지인 중 한 사람이 작성한이 기사를 참조하십시오.)

http://arxiv.org/abs/1304.6899

이것은 임의의 거리 행렬을 입력으로 취하는 일반화 된 k- 평균 구현에 관한 것입니다. 대각선이 0 인 대칭 비음 수 행렬 일 수 있습니다. 이상한 거리 행렬에 대해서는 합리적인 결과를 얻지 못할 수 있습니다. 이 프로그램은 C #으로 작성되었습니다.

위의 링크를 방문한 후 기타 형식을 클릭하고 소스 다운로드를 클릭하면 소스 코드를 얻을 수 있습니다. 그런 다음 Program.cs가 포함 된 .tar.gz를 얻게됩니다. 또는 소스 코드를 PDF에서 복사 할 수도 있습니다.


3

Java Machine Learning Library를 사용할 수 있습니다. 그들은 K-Means 구현을 가지고 있습니다. 생성자 중 하나가 세 개의 인수를 허용합니다.

  1. K 가치.
  2. 그 객체는 DistanceMeasure 클래스 의 인스턴스입니다 .
  3. 반복 횟수

원하는 결과를 얻기 위해 DistanceMeasure 클래스를 쉽게 확장 할 수 있습니다. 아이디어는이 클래스의 measure (Instance x, Instance y) 메소드에서 사용자 정의 거리 행렬의 값을 반환하는 것입니다.

K-Means는 거리 메트릭의 특정 속성을 가정하여 수렴하도록 조정됩니다. 유클리드 거리, 맨하탄 거리 또는 기타 표준 메트릭이 이러한 가정을 충족시킵니다. 사용자 정의 거리 메트릭은 이러한 가정을 충족하지 않을 수 있으므로 생성자에는 클러스터 러를 빌드하기 위해 실행할 반복 횟수를 지정하는 세 번째 매개 변수가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.