我正在做一个项目,需要说明某个ID最有可能。让我举个例子来解释。我有3个字典包含ID及其分数
Ex: d1 = {74701: 3,90883: 2}
我这样分配百分比分数,
d1_p ={74701: 60.0, 90883: 40.0},这里的分数是(d1中键的值)/(值的总和)
同样的,我还有另外两本字典
d2 = {90883: 74701: 2}, d2_p = {90883.0: 50.0, 74701.0, 50.0}
d3 = {75853: 2}, d3_p = {75853: 100.0}
我的任务是为以上3个字典中的每个ID给出一个综合分数,并通过取最高分来决定获胜者。我如何在数学上为每个ID分配0-100之间的综合分数??
示例:在上面的例子中,74701必须是明确的赢家。
我试着给出平均值,但它失败了,因为我需要为多个字典中出现的ID提供更多的偏好。例如:假设74701在d1和d2中占多数,有30,40个值。那么它的平均值将是(30+40+0)/3 = 23.33,而只出现一次的75853将得到(100+0+0)/3 = 33.33,这是错误的。
因此,有人能在python中提出一个好的数学方法,用可能的代码给出这样的分数并决定多数吗?
由于您的主要目标是分析频率,因此我建议将所有数据汇总到一个字典中,而不是尝试从不同的字典中创建全局分数,这样通常更不容易出错。假设我有3本字典:
a = {1: 2, 2: 3}
b = {2: 4, 3: 5}
c = {3: 4, 4: 9}
您可以通过对每个键的值求和来将这三个字典合并为一个:
result = {1: 2, 2: 7, 3: 9, 4: 9}
这可以通过使用Counter
:
from collections import Counter
result = Counter(a)
result.update(Counter(b))
result.update(Counter(c))
result = dict(result)
将产生所需的摘要。如果您希望每个字典的权重不同,也可以以类似的方式完成,那么您不应该试图从作为单独实体的字典中获取信息,而是将它们合并到一个统计数据中。
以表格的方式考虑数据:对于每场比赛/比赛/任何事情,每个ID得到一定数量的点。如果你最关心的是总分整个游戏序列(游戏邦注:也就是整个"季节")就会累积起来决定获胜者的分数(然后将所有东西缩小/扩大到0到)100年).
74701 90883 75853
---------------------------
1 3 2 0
2 2 2 0
3 0 0 2
Total 5 4 2
或者,我们可以用每场比赛的百分比来表示相同的分数。同样,每个ID都必须给定一个值。在这种情况下,我们需要求平均值百分比——包括零在内的所有百分比:
74701 90883 75853
---------------------------
1 .6 .4 0
2 .5 .5 0
3 0 0 100
Avg .37 .30 .33
根据上下文,这两种方法都有意义。两者都是如所希望的那样,宣布74701为胜利者。但是注意它们给出的是不同的第二名和第三名的结果。这种差异的产生是因为两种体系优先处理不同的事情。你需要决定你更喜欢哪一种方法。
无论哪种方式,第一步都是更好地组织数据。似乎更多方便地获得每个ID的所有分数或百分比,因此您可以执行这听起来像是将id映射到分数列表的字典或百分比。
# Put the data into one collection.
d1 = {74701: 3, 90883: 2}
d2 = {90883: 2, 74701: 2}
d3 = {75853: 2}
raw_scores = [d1, d2, d3]
# Find all IDs.
ids = tuple(set(i for d in raw_scores for i in d))
# Total points/scores for each ID.
points = {
i : [d.get(i, 0) for d in raw_scores]
for i in ids
}
# If needed, use that dict to create a similar dict for percentages. Or you
# could create a dict with the same structure holding *both* point totals and
# percentages. Just depends on the approach you pick.
pcts = {}
for i, scores in points.items():
tot = sum(scores)
pcts[i] = [sc / tot for sc in scores]