用于分组相似参数的逻辑

时间:2014-05-24 04:04:19

标签: javascript php python c vba

我试图找出在一定容差范围内对参数进行分组的最佳逻辑。通过一个例子更容易解释......

Task1: parameter1=140
Task2: parameter1=137
Task3: parameter1=142
Task4: parameter1=139
Task5: parameter1=143

如果我想将任务分组,如果他们彼此在2之内,我想我需要做几次通过。例如,期望的结果是:     Task4涵盖Task1,Task2和Task4     Task3涵盖Task3和Task5

有多种可能性,因为Task1也可以覆盖3和4,但是2和5将是两个额外的任务。基本上,我希望彼此之间的任务数量最少。

我目前正在尝试在excel VBA中执行此操作,但我可能稍后将代码移植到php。我真的只是不知道从哪里开始,因为它看起来很复杂。

2 个答案:

答案 0 :(得分:1)

我需要一个聚类算法。请考虑以下参数 -

Task1: parameter1=140
Task2: parameter1=142
Task3: parameter1=144
Task4: parameter1=146
Task5: parameter1=148

根据您的逻辑,群集在这里会变得奇怪。如果您只是检查每个数字附近的数字,那么所有这些数字都将被聚类。但140和148应该属于同一个集群吗?尝试kmeans群集。会有一些灰色区域,但结果会相对准确。

http://en.wikipedia.org/wiki/K-means_clustering

答案 1 :(得分:1)

如果在查看任务之前决定组边界,则可以在单个传递中对任务进行分组。这是一个使用宽度为4的桶的简单示例,基于您的目标将任务分组在+/- 2之内:

Dim bucket As Integer

For Each parameter In parameters
    bucket = Round(parameter / 4, 0)

    ' ... do something now that you know what bucket the task is in
Next parameter

如果固定存储桶提供的组不能足够满足您的需求,则需要使用多次传递的算法。由于示例中的数据是一维的,因此您可以(并且应该!)use simpler techniques than k-means clustering

下一个好看的地方可能是Literate Jenks Natural Breaks and How The Idea Of Code is Lost,在JavaScript中有很好的评论Jenks Natural Breaks Optimization。