我试图找出在一定容差范围内对参数进行分组的最佳逻辑。通过一个例子更容易解释......
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。我真的只是不知道从哪里开始,因为它看起来很复杂。
答案 0 :(得分:1)
我需要一个聚类算法。请考虑以下参数 -
Task1: parameter1=140
Task2: parameter1=142
Task3: parameter1=144
Task4: parameter1=146
Task5: parameter1=148
根据您的逻辑,群集在这里会变得奇怪。如果您只是检查每个数字附近的数字,那么所有这些数字都将被聚类。但140和148应该属于同一个集群吗?尝试kmeans群集。会有一些灰色区域,但结果会相对准确。
答案 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。