我正在尋找一種演算法來為不同的值獲得不同的方法。示例:我有值 1.6, 1.7, 5.6, 5.7, 5,5 所以輸出應該是 1.65 和 5.7
uj5u.com熱心網友回復:
如果您知道每個集群周圍的“范圍”意味著
一個可能的簡單解決方案:將每個值四舍五入為“范圍”引數的倍數;對四舍五入為相同倍數的值進行分組。
要分組,您可以使用sortedand的組合itertools.groupby,或者更簡單地說,您可以使用 a dictof lists。
from collections import defaultdict
def clusters(data, r):
groups = defaultdict(list)
for x in data:
groups[x // r].append(x)
return groups
def means_of_clusters(data, r):
return [sum(g) / len(g) for g in clusters(data, r).values()]
print( means_of_clusters([1.6, 1.7, 5.6, 5.7, 5.5], 0.4) )
# [1.65, 5.55, 5.7]
請注意 5.7 如何與 5.5 和 5.6 分開,因為 5.5 和 5.6 被四舍五入為13*0.4,而 5.7 被四舍五入為14*0.4。
如果你知道集群的數量
您在評論中提到總會有 2 個集群。我建議只尋找排序串列中兩個連續數字之間的最大差距,并在該差距上進行拆分:
def split_in_2_clusters(data):
seq = sorted(data)
split_index = max(range(1, len(seq)), key=lambda i: seq[i] - seq[i-1])
return seq[:split_index], seq[split_index:]
def means_of_2_clusters(data):
return tuple(sum(g) / len(g) for g in split_in_2_clusters(data))
print( means_of_2_clusters([1.6, 1.7, 5.6, 5.7, 5.5]) )
# (1.65, 5.6000000000000005)
對于更復雜的聚類問題
我強烈建議查看庫scikit-learn 中實作的所有聚類演算法。檔案頁面在一個漂亮的表格中列出了演算法,解釋了哪種演算法需要哪些引數;因此您可以輕松選擇最適合您情況的演算法。
- scikit-learn:聚類演算法
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/395970.html
上一篇:為什么二叉樹遍歷(如前序)的時間復雜度不是指數級的?
下一篇:使串列盡可能無序的函式
