[英]Python clustering list of sets
對於一組集合,我需要將它們分組到多個“集群”中,集群中的所有節點都是該集群中最大節點的子集。 例如
input = [{1, 2}, {1, 2, 3}, {1, 2, 4}, {1, 4}, {1}]
將得到:
[{1, 2, 3}, {1, 2}, {1}],
[{1, 2, 4}, {1, 2}, {1, 4}, {1}]
我已經嘗試參考this構建一個子集樹,但是當輸入很大時它很快就會變得非常慢,因為它會為每次插入迭代所有子節點。
我不熟悉 k-mean 聚類,但它是否適用於這里的問題?
最有效的方法是什么?
首先按長度降序對列表進行排序。 這樣你就從最長的集合開始,這些集合肯定不是任何其他集合的子集。
然后,將每個代表集保存為具有列表值的字典的鍵(轉換為元組后)。
對於每個集合,檢查它是否是任何鍵的子集並將其添加到相應的列表中。
只有當它沒有被添加到任何鍵時,它才意味着它是一個新的代表。
最后,取結果字典的values()
:
l = [{1, 2}, {1, 2, 3}, {1, 2, 4}, {1, 4}, {1}]
grouped_sets = {}
for cur_set in sorted(l, key=len, reverse=True):
is_subset = False
for represent, sets in grouped_sets.items():
if cur_set.issubset(represent):
sets.append(cur_set)
is_subset = True
if not is_subset:
grouped_sets[tuple(cur_set)] = [cur_set]
print(list(grouped_sets.values()))
這使:
[[{1, 2, 3}, {1, 2}, {1}],
[{1, 2, 4}, {1, 2}, {1, 4}, {1}]]
也許按長度遞減的順序對集合進行排序會將交叉點的數量減少到每個集群每個集合一個。 這將取決於數據,如果沒有子集,則不會改善,但隨着集群更大,它應該會改善:
setList = [{1, 2}, {1, 2, 3}, {1, 2, 4}, {1, 4}, {1}]
groups = []
for aSet in sorted(setList,key=len,reverse=True):
clusters = [g for g in groups if g[0].issuperset(aSet)]
if not clusters:
groups.append([])
clusters = groups[-1:]
for g in clusters:
g.append(aSet)
print(groups)
[[{1, 2, 3}, {1, 2}, {1}], [{1, 2, 4}, {1, 2}, {1, 4}, {1}]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.