Java 多参数K-均值算法

Java 多参数K-均值算法,java,algorithm,k-means,Java,Algorithm,K Means,我在地图上有一组点。我正在尝试创建集群。除了距离之外,我还要考虑每个集群的最大成本(作为另一个参数) 请查找下面的代码片段 private void assignCluster(List<Cluster> finalClusters, List<Node> clusterNodes, int maxCostLimit) { double max = Double.MAX_VALUE; double min = max; int clusterInd

我在地图上有一组点。我正在尝试创建集群。除了距离之外,我还要考虑每个集群的最大成本(作为另一个参数)

请查找下面的代码片段

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);
        }
    }
}
我指的是基本Kmeans算法的这个链接:

通常,K-means算法可以显示为从不重复上一次迭代中的节点到集群的分配

也许这在你的情况下是可能的,因为你引入了额外的成本约束,这在传统上在使用K-means时是不存在的,但也许它仍然不存在,我不确定

我想知道您是如何使用这个
assignCluster()
方法的,您已经为这个方法提供了代码。您是否有另一个循环围绕着它,它不断调用
assignCluster()
,使用
finalClusters=
集群的最新分配列表,以及
clusterNodes=
所有节点的列表,并不断循环,直到最后得到与前一个相同的分配为止

如果是这样,您是否确定
cluster.addClusterNode()
正确地将该节点从其“以前的集群”中删除(如果您按照上述方式实现它,我认为应该这样做?)。另一个要查看的内容可能是
(cluster.getTotalDemand()+node.getCost())
计算。我怀疑,如果您碰巧正在查看该节点已经在其中的集群,您可能不希望在该计算中包含
node.getCost()
,因为如果它也包含在
cluster.getTotalDemand()
中,它将被加倍计算


我必须做出一些假设,比如你到底想要代码做什么,或者你如何实现其他没有显示代码的方法。。。因此,您必须指出我的假设中是否存在任何错误。

查看您随问题提供的代码并通过链接,我看不到无限循环的任何原因(假设您正确地修改了代码),除了可能性,集群总数乘以每个集群的最大成本小于所有节点的总成本之和。在进入循环之前,可以通过迭代所有节点来检查这一点

另一个问题可能是,您忘记在
clearcluses()
方法中重置每个集群的
totalCost
,但我认为这不会导致无限循环


为什么你的类类型的质心是
Point2D
而不是你自己的
Point
类的对象?

你能发布你的类簇和点的代码吗?我觉得你好像陷入了局部最优。如果我错了,请更正,但我认为您只是随机生成质心-至少您应该这样做。所以我相信您需要一种机制来检查两次迭代之间的状态。例如,您应该能够检测到您的质心是否从(A1,B1)移动到(A2,B2),然后返回到(A1,B1)。在这种情况下,需要创建一个新的质心。无论如何,发布更多代码会很有帮助。一旦调用了
assignCluster()
方法assignCluster,您是否也可以在更新质心的位置发布代码?随着节点“成本”的引入,您有一些点根本没有分配给集群,这就是您要寻找的吗?这段代码甚至没有编译(缺少return语句)。请更正。基本Kmeans算法适用于距离。我添加了另一个参数成本。在为集群分配节点时,我还检查了距离和成本限制。这类似于创建大小相同的集群。@NVG每个节点的成本都相同吗?如果没有,您能否尝试更改它,使每个节点都具有相同的成本,并查看在这种情况下,您是否不再陷入无限循环?我怀疑只有当节点具有不同的成本时,交替分配才可能。。。如果是这样的话,您可能可以通过保存最近几次迭代(不止一次)的集群节点分配的历史记录,并检查最近的分配是否等于最近的任何X OneSye,来避免无限循环。我尝试将成本1分配给每个节点。尽管如此,它仍然是相同的:-(@NVG)您可以发布调用
assignCluster
函数的循环的代码吗?按照您提供的链接,这应该是
calculate
方法。我想问题一定在那里是的,而循环在calculate方法中。
public class Cluster{
    private List<Node> clusterNodes = new ArrayList<Node>();
    private Integer totalCost = 0;
    private Point2D point;

         //getters and setters
}
public class Point{
    private double x = 0;
    private double y = 0;

        // getters and setters

       //method to find the distance between 2 points
}