对相似参数进行分组的逻辑
Posted
技术标签:
【中文标题】对相似参数进行分组的逻辑【英文标题】:Logic for grouping similar parameters 【发布时间】:2014-07-13 12:29:44 【问题描述】:我试图找出在一定容差范围内对参数进行分组的最佳逻辑。举个例子更容易解释...
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 将是两个单独的附加任务。基本上,我希望彼此相距 2 以内的任务数量最少。
我目前正在尝试在 excel VBA 中执行此操作,但稍后我可能会将代码移植到 php。我真的不知道从哪里开始,因为它看起来很复杂。
【问题讨论】:
【参考方案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
【讨论】:
【参考方案2】:如果您在查看任务之前确定了组边界,则可以一次性将任务分组。下面是一个使用宽度为 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,其中有一个很好的评论 Jenks Natural Breaks Optimization in javascript。
【讨论】:
我认为这并不重要,因为我只会使用建议的方法两次,但它实际上是二维的。我试图让它成为一个简单的问题。有一个 parameter2 会有类似的约束。这些任务将按参数 1 的值彼此相距 2 进行分组,也按参数 2 的值彼此相距在 2 以内进行分组。也许 k-means 将是要走的路。 在这种情况下,维度很重要;您可以对一维数据进行排序,而二维或更多维度则无法做到这一点。尝试 k-means,并考虑使用现有的实现,如 SciPy 的kmeans,而不是自己编写。如果它给出了您期望的结果,这将使您更快地看到。以上是关于对相似参数进行分组的逻辑的主要内容,如果未能解决你的问题,请参考以下文章