대화식 유전 알고리즘에서 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;
}
힌트를 보내 주셔서 감사합니다. 새로운 점을 만들지 않고 인구 중심을 한 점으로 사용하고 싶습니다. 하지만이 구현을 사용하고 싶습니다. 유일한 문제는'centroidOf()'메소드를 구현하는 방법이다. 현재 컬렉션의 한 지점을 임의로 선택하고 있습니다. – Stephan
링크에 알고리즘이 있습니다. – cyborg
귀하의 링크 때문에 답변을 수락합니다. 원하는 구현이 원래 질문에 표시됩니다. – Stephan