2012-02-01 5 views
2

대화식 유전 알고리즘에서 Apache Commons Math의 k-means ++ clusterer를 사용하여 사용자가 평가 한 개인 수를 줄입니다.거리를 사용하여 k-means ++에서 도심을 계산하는 방법은 무엇입니까?

Commons Math를 사용하면 매우 쉽게 사용할 수 있습니다. 사용자는 Clusterable 인터페이스 만 구현하면됩니다. 두 가지 방법이 있습니다 :

double distanceFrom(T p) 매우 명확하고 T centroidOf(Collection<T> p), 사용자가 클러스터의 중심을 선택할 수 있습니다.

유클리드 점에서 사용하는 경우, 무게 중심을 계산하기가 매우 쉽습니다. 그러나 염색체에 대해서는 그 의미가 항상 명확하지 않기 때문에 매우 어렵습니다.

내 질문 : 문제 도메인에 의존하지 않고 중심을 선택하는 효율적인 일반적인 방법이 있습니까? (예를 들어 거리를 사용하여)


편집

이 좋아, 지금 여기에서 중심 계산에 내 코드입니다. 아이디어 : 다른 모든 점들과 가장 낮은 총 거리를 갖는 점이 중심에 가장 가깝습니다.

public T centroidOf(Collection<T> c) { 
    double minDist = Double.MAX_VALUE; 
    T minP = null; 

    // iterate through c 
    final Iterator<T> it = c.iterator(); 
    while (it.hasNext()) { 
    // test every point p1 
    final T p1 = it.next(); 
    double totalDist = 0d; 
    for (final T p2 : c) { 
     // sum up the distance to all points p2 | p2!=p1 
     if (p2 != p1) { 
     totalDist += p1.distanceFrom(p2); 
     } 
    } 

    // if the current distance is lower that the min, take it as new min 
    if (totalDist < minDist) { 
     minDist = totalDist; 
     minP = p1; 
    } 
    } 
    return minP; 
} 

답변

1

K- 수단은 평균화 메트릭 (예를 들면, 유클리드)를 필요로한다. 그러한 지표와 공간을 정의하지 않으면 점의 평균이 실제로 공간 내부의 지점인지 여부조차 알지 못합니다.

그러나 원래 점을 메도 이드의 후보로 간주하는 k-medoids을 사용할 수 있습니다 (k-means는 원점에 꼭 필요하지 않은 평균/중심을 찾습니다). 이 알고리즘은 pairwise 비 유사성을 최소화하는 점 (즉, distanceFrom)을 찾습니다.

+0

힌트를 보내 주셔서 감사합니다. 새로운 점을 만들지 않고 인구 중심을 한 점으로 사용하고 싶습니다. 하지만이 구현을 사용하고 싶습니다. 유일한 문제는'centroidOf()'메소드를 구현하는 방법이다. 현재 컬렉션의 한 지점을 임의로 선택하고 있습니다. – Stephan

+0

링크에 알고리즘이 있습니다. – cyborg

+0

귀하의 링크 때문에 답변을 수락합니다. 원하는 구현이 원래 질문에 표시됩니다. – Stephan