【发布时间】:2017-01-27 23:19:29
【问题描述】:
我在地图上有一组点。我正在尝试创建集群。除了距离之外,我还在考虑每个集群的最大成本(作为另一个参数)。
请找到下面的代码sn-p。
private void assignCluster(List<Cluster> finalClusters, List<Node> clusterNodes, int maxCostLimit) {
double max = Double.MAX_VALUE;
double min = max;
int clusterIndex = 0;
double distance = 0.0;
for (Node node : clusterNodes) {
min = max;
for (int i = 0; i < finalClusters.size(); i++) {
Cluster cluster = finalClusters.get(i);
distance = Point.getDistanceBetweenPoints(node.getPoint(), cluster.getPoint());
if (distance < min && (cluster.getTotalCost() + node.getCost()) <= maxCostLimit) {
min = distance;
clusterIndex = i;
}
}
if (min != max) {
Cluster cluster = finalClusters.get(clusterIndex);
cluster.setTotalCost(cluster.getTotalCost() + node.getCost());
cluster.addClusterNode(node);
}
}
}
如果我尝试创建集群,它将进入无限循环。或者,地图上的两个点被分配给两个不同的集群。在每次迭代中,这两个集群的质心都在变化。 请建议我,我怎样才能做到这一点?
编辑
Cluster.java
public class Cluster{
private List<Node> clusterNodes = new ArrayList<Node>();
private Integer totalCost = 0;
private Point2D point;
//getters and setters
}
Point.java
public class Point{
private double x = 0;
private double y = 0;
// getters and setters
//method to find the distance between 2 points
}
我指的是基本 Kmeans 算法的链接:http://www.dataonfocus.com/k-means-clustering-java-code/
【问题讨论】:
-
你能发布你的类Cluster和Point的代码
-
在我看来,您正陷入局部最优状态。如果我错了,请纠正,但我想你是随机生成你的质心 - 至少你应该这样做。所以我相信你需要一种机制来检查两次迭代之间的状态。例如,您应该能够检测到您的质心是否从 (A1,B1) 移动到 (A2,B2),然后又回到 (A1,B1)。在这种情况下,您需要创建一个新的质心。无论如何发布更多代码会有所帮助。
-
您是否也可以发布更新质心的代码,一旦您致电
assignCluster() -
调用assignCluster方法后如何生成簇质心?随着节点“成本”的引入,您有一些根本没有分配给集群的点,这就是您要寻找的吗?
-
此代码甚至无法编译(缺少返回语句)。请更正。