Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 大小相等的k簇中的n组点_Algorithm_Cluster Analysis_K Means - Fatal编程技术网

Algorithm 大小相等的k簇中的n组点

Algorithm 大小相等的k簇中的n组点,algorithm,cluster-analysis,k-means,Algorithm,Cluster Analysis,K Means,可能重复: 编辑:像卡斯佩林一样,向我指出这个问题是重复的。无论如何,这里有一个更一般化的问题,包括这个问题: 我的要求 在一个项目中,我需要将n个点(x,y)分组为大小相等(n/k)的k个簇。其中x和y是双浮点数,n的范围为100到10000,k的范围为2到100。在算法运行之前,k也是已知的 我的实验 我开始使用该算法来解决这个问题,该算法可以快速有效地生成大小大致相同的k个簇 但我的问题是,K-means产生的簇大小大致相同,我需要簇大小完全相同(或者更准确地说,我需要它们的大小介于地板

可能重复:

编辑:像卡斯佩林一样,向我指出这个问题是重复的。无论如何,这里有一个更一般化的问题,包括这个问题:

我的要求

在一个项目中,我需要将n个点(x,y)分组为大小相等(n/k)的k个簇。其中x和y是双浮点数,n的范围为100到10000,k的范围为2到100。在算法运行之前,k也是已知的

我的实验

我开始使用该算法来解决这个问题,该算法可以快速有效地生成大小大致相同的k个簇

但我的问题是,K-means产生的簇大小大致相同,我需要簇大小完全相同(或者更准确地说,我需要它们的大小介于地板(n/K)和天花板(n/K)之间)

在你向我指出之前,是的,我在这里尝试了第一个答案,这听起来是个好主意

其主要思想是通过K-means对集群产生的数组进行后处理。从最大的集群到最小的集群。我们通过将额外的点移动到另一个最近的簇来减小具有n/k个以上成员的簇的大小。更不用说已经减少的集群了

以下是我实现的伪代码:

n is the number of point
k is the number of cluster
m = n / k (the ideal cluster size)
c is the array of cluster after K-means
c' = c sorted by size in descending order
for each cluster i in c' where i = 1 to k - 1
    n = size of cluster i - m (the number of point to move)
    loop n times
        find a point p in cluster i with minimal distance to a cluster j in c' where j > i
        move point p from cluster i to cluster j
    end loop
    recalculate centroids
end for each
该算法的问题是,在接近过程结束时(当我接近k时),我们必须在c中选择一个簇j’(其中j>i,因为我们需要忽略已处理的簇),但我们发现的这个簇j可能远离簇i,从而打破了簇的概念

我的问题

是否有一个后K-means算法或K-means变体可以满足我的要求,或者我从一开始就错了,我需要找到其他聚类算法


PS:我不介意自己实现这个解决方案,但如果我能使用一个库,最好是JAVA,那就太好了。

我不是这方面的专家,我曾经需要想出一个简单的算法来对地图上的位置进行聚类,其中每个点都需要是一个集群的一部分,集群以多种方式绑定(不仅仅是在规模(即点数)上,还包括一些取决于各种因素的其他措施)

通过首先找到“难点”,然后在此基础上增加集群,我得到了最好的结果点将是难以到达的点,例如,因为它们单独位于整个区域的外围,或者因为它们比其他点更能帮助到达另一个簇边界条件。这有助于整齐排列簇,留下很少的孤独者和相应的手工放置它们


如果您当前的算法通常会最后找到这些难点,这可能会对您有所帮助。

尝试以下k-means变化:

初始化

  • 从数据集中随机选择
    k
    中心,或者更好地使用kmeans++策略
  • 对于每个点,计算到其最近簇中心的距离,并为此构建堆
  • 从堆中绘制点,并将其分配到最近的群集,除非群集已满。如果已满,请计算下一个最近的群集中心并重新插入堆中
最后,您应该有一个分区来满足每个簇+-1个相同数量的对象的要求(确保最后几个簇也有正确的数量。第一个
m
簇应该有
ceil
对象,其余的正好是
floor
对象。) 请注意,使用堆可以确保集群保持凸:如果它们不再凸,则会有更好的交换候选

迭代步骤

必备条件:每个集群的列表,其中包含“交换建议”(希望位于不同集群中的对象)

E步骤:按照常规k均值计算更新后的聚类中心

M步骤:迭代所有点(一个点或一批中的所有点)

计算距离对象最近的群集中心/距离当前群集最近的所有群集中心。如果它是不同的群集:

  • 如果另一个集群比当前集群小,只需将其移动到新集群
  • 如果另一个集群(或距离较低的任何集群)有交换建议,则交换两个元素集群分配(如果有多个提议,则选择改进最大的一个)
  • 否则,请指明另一个群集的交换建议
簇大小保持不变(+-天花板/地板差异),只要能够改善估计,对象只会从一个簇移动到另一个簇。因此,它应该像k-均值一样收敛于某个点。不过可能会稍微慢一点(即更多迭代)


我不知道以前是否发布或实现过此功能。这正是我要尝试的(如果我尝试k-means,会有更好的聚类算法。)

如何选择初始聚类?聚类数量及其初始质心由用户(人类)选择@casperOne,你以重复的方式结束了这个问题?事实上,我在我的问题中说,我在中尝试了建议的解决方案,但没有成功,我试图在这里进一步,询问是否还有其他解决方案。但如果你决定继续关闭它,我不会生你的气:)“我只是不认为它是重复的。@皮埃尔·戴维德贝朗格:你的问题没有很好地将自己与另一个问题区分开来。如果你能做出重大改变,指出不同之处(在问题中,而不是在评论中),那么它可以重新打开。还有,你有没有考虑过问一下?考虑到这个网站的存在,这个问题有点离题。你试过所有的答案了吗