我在交互式遗传算法中使用来自Apache Commons Math的k-means ++ clusterer来减少用户评估的个体数量。
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;
}
答案 0 :(得分:1)
k-means 需要平均度量(例如,欧几里德)。如果没有定义这样的度量和空间,您甚至不知道点的平均值是否实际上是空间内的一个点。
然而,你可以使用k-medoids,它只考虑原始点作为medoids的候选者(而k-means找到不一定在原始点上的平均值/质心)。该算法寻找最小化成对不相似性的点(即distanceFrom
)。