2
我在交互式遺傳算法中使用Apache Commons Math中的k-means ++聚類器來減少用戶評估的個人數量。如何使用距離計算k-means ++中的質心?
Commons Math使其非常易於使用。用戶只需要實現接口即可。它有兩種方法:
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 2012-02-02 01:01:56
鏈接中有一個算法。 – cyborg 2012-02-02 05:15:12
由於您的鏈接,我接受答案。原始問題現在顯示了所需的實現。 – Stephan 2012-02-03 12:13:42