【问题标题】:Python - Weighted choice + adjusting weights [duplicate]Python - 加权选择+调整权重[重复]
【发布时间】:2018-03-21 21:56:54
【问题描述】:

我正在做类似于Weighted choice short and simple 的事情,但是,我还需要根据场景调整权重。

我尝试做一些简单的算术运算,即weight *= 2,但累积和必须等于 1(显然)而且我不知道如何调整一个权重,并让其他权重也调整.. 必须有我正在监督的一些简单的解决方案。

场景

mylist = ['a', 'b', 'c', 'd']
myweights = [0.25, 0.25, 0.25, 0.25]

mylist 中选择一个项目并通过一个函数运行它后,我想在根据调整后的权重选择另一个项目之前,向上或向下调整与该项目相关的重量。

【问题讨论】:

  • 是的,我想它确实符合重复的条件。我只想指出,我可能从未发现过这个问题,因为我尝试使用关键字“更新权重”和“权重分布”等,而不是“标准化”。

标签: python


【解决方案1】:

在权重更新后添加这个怎么样:

s = sum(myweights)
myweights = [w/s for w in myweights]

【讨论】:

  • 我很欣赏这个答案,并会尝试实现它,看看会发生什么。
  • 但这肯定也会改变更新后的权重?例如。如果将“c”更改为 0.5,这也会被加权..
  • 我已经实现了这个,并且很可能会使用这个解决方案,除非出现更好的替代方案。 @jpp 提出的观点是有效的,但在我的用例中它很好。
【解决方案2】:

这是使用numpy 的一种方式,假设您要修复更新并线性分配差异以确保 sum(weights) 等于 1。

import numpy as np

def weight_updater(lst, oldweights, item, new):
    newweights = oldweights.copy()
    idx = lst.index(item)
    newweights += (oldweights[idx] - new)/(len(newweights)-1)
    newweights[idx] = new
    return newweights

mylist = ['a', 'b', 'c', 'd']
myweights = np.array([0.25, 0.25, 0.25, 0.25])

res = weight_updater(mylist, myweights, 'c', 0.5)

# array([ 0.16666667,  0.16666667,  0.5       ,  0.16666667])

【讨论】:

    猜你喜欢
    • 2019-02-19
    • 2011-06-05
    • 2012-06-03
    • 2014-03-11
    • 1970-01-01
    • 2020-04-13
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多