2012-02-01 62 views
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; 
} 

回答

1

k均值需要的平均度量(例如,歐幾里得)。沒有定義這樣的度量和空間,你甚至不知道點的平均值是否實際上是空間內的一個點。

但是,您可以使用k-medoids,它只考慮原始點作爲medoids的候選項(而k-均值找到不一定在原始點上的均值/質心)。該算法尋找其最小化成對相異點(即,distanceFrom)。

+0

感謝您的提示。我想用人口中的一點作爲質心而不創建新的點。但我也想使用這個實現。唯一的問題是如何實現'centroidOf()'方法?目前我正在隨機選擇一個集合點。 – Stephan 2012-02-02 01:01:56

+0

鏈接中有一個算法。 – cyborg 2012-02-02 05:15:12

+0

由於您的鏈接,我接受答案。原始問題現在顯示了所需的實現。 – Stephan 2012-02-03 12:13:42