首页 > 解决方案 > 对数字列表进行分组/聚类,以使每个子集的最小-最大间隙始终小于 Python 中的截止值

问题描述

假设我有一个包含 50 个随机数的列表。我想以每个子集的最小-最大差距小于截止值 0.05 的方式对数字进行分组。下面是我的代码。

import random

def cluster(data, cutoff):
    data.sort()
    res = []
    old_x = -10.
    for x in data:
        if abs(x - old_x) > cutoff:
            res.append([x])
        else:
            res[-1].append(x)
        old_x = x
    return res

cutoff = 0.05
data = [random.random() for _ in range(50)]
res = cluster(data, cutoff)

检查所有子集的最小-最大间隙是否小于截止值:

print(all([(max(s) - min(s)) < cutoff for s in res]))

输出:

False

显然我的代码不起作用。有什么建议么?

标签: pythonalgorithmgroupingsubsetcluster-analysis

解决方案


您只是检查下一个元素是否按排序顺序(就是这样)在前一个old_x元素的截止范围内,而不是其集群中的最小元素。因此,例如,您将为输入输出单个集群[20, 20.03, 20.06]

通过仅old_x在启动新集群时更新来解决此问题。

一般调试提示:始终尝试在小型实例上重现您的问题。一个好方法是从失败的测试输入开始,然后反复从中删除元素,直到它通过。现在您知道该元素有一些特别之处。


推荐阅读