如何在不指定聚类数的情况下对列表项进行聚类

2 投票
1 回答
2063 浏览
提问于 2025-04-17 22:31

我的目标是根据下面列表中任意两个相邻项目之间的距离,将这些项目分成不同的组。组的数量没有具体要求,只要相邻项目之间的最大距离不超过某个值,它们就可以被归为同一组。

我的尝试

import itertools
max_dist=20
_list=[1,48,52,59,89,94,103,147,151,165]
Ideal_result= [[1],[48,52,59],[89,94,103],[147,151,165]]

def clust(list_x, max_dist):
    q=[]
    for a, b in itertools.combinations(list_x,2):
        if b-a<=20:
            q.append(a),(b)
        else:continue
        yield q
print list(clust(_list,max_dist))

输出结果:

[[48,48,52,89,89,94,147,147,151],[48,48,52,89,89,94,147,147,151],..]`

输出结果完全不对,但我只是想展示一下我的尝试。

有没有什么建议可以让我得到理想的结果?谢谢。

1 个回答

2

这个代码能通过你的测试:

def cluster(items, key_func):
    items = sorted(items)
    clusters = [[items[0]]]
    for item in items[1:]:
        cluster = clusters[-1]
        last_item = cluster[-1]
        if key_func(item, last_item):
            cluster.append(item)
        else:
            clusters.append([item])
    return clusters

在这里,key_func 函数会返回 True,如果当前的项和前一个项应该被归为同一组:

>>> cluster([1,48,52,59,89,94,103,147,151,165], lambda curr, prev: curr-prev < 20)
[[1], [48, 52, 59], [89, 94, 103], [147, 151, 165]]

另一种可能性是修改 "等效代码",让 itertools.groupby() 的关键函数也能接受多个参数。

撰写回答