具有多个参数的K均值算法

时间:2016-09-20 06:33:43

标签: java algorithm k-means

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

请查看以下代码段。

public class Cluster{
    private List<Node> clusterNodes = new ArrayList<Node>();
    private Integer totalCost = 0;
    private Point2D point;

         //getters and setters
}

如果我尝试创建集群,它将进入无限循环。或者,地图上的两个点将分配给两个不同的群集。在每次迭代中,这两个集群的质心都在变化。 请建议我,我怎样才能做到这一点?

EDITS

Cluster.java

public class Point{
    private double x = 0;
    private double y = 0;

        // getters and setters

       //method to find the distance between 2 points
}

Point.java

/(?:[-+() ]*\d){10,13}/g

我将此链接称为基本Kmeans算法:http://www.dataonfocus.com/k-means-clustering-java-code/

2 个答案:

答案 0 :(得分:1)

通常情况下, K -means算法可以显示为永远不会重复从上一次迭代中将节点分配给集群。

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

我想知道您如何使用此代码提供的assignCluster()方法。你是否有另一个循环,它不断调用assignCluster() finalClusters =最新的集群分配列表,clusterNodes =所有节点列表,并保持循环,直到它结束一个与前一个相同的作业?

如果是这样,您确定cluster.addClusterNode()是否正确地从其先前的群集中移除了节点(正如我假设如果您按照上述方式实现它那么应该这样做?)。另一件需要考虑的事情可能是(cluster.getTotalDemand() + node.getCost())计算。我怀疑,如果您正在查看该节点已经存在的群集,您可能不希望在该计算中包含node.getCost(),因为如果也,它将被计为双倍包含在cluster.getTotalDemand()

我不得不假设你想要代码究竟做什么,或者你是如何实现代码未显示的其他方法......所以你必须指出我的代码是否有任何错误假设

答案 1 :(得分:1)

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

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

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