gpt4 book ai didi

python - 定义一个算法,它获取一个数字和一个列表,并根据数字与列表平均值的距离返回一个标量

转载 作者:太空狗 更新时间:2023-10-29 21:21:45 26 4
gpt4 key购买 nike

假设我们有一个列表,它在每次迭代中附加一个介于 15 和 32 之间的整数(我们称该整数为 rand)。我想设计一种算法,为每个 rand 分配大约 1(1.25 到 0.75 之间)的奖励。分配奖励的规则是这样的。

首先我们计算列表的平均值。那么如果 rand 大于平均值,我们期望奖励小于 1,如果 rand 小于平均值,则奖励高于 1。距离越远在 average 和 rand 之间,奖励增加/减少的越多。例如:

rand = 15, avg = 23 然后 reward = 1.25

rand = 32, avg = 23 然后 reward = 0.75

rand = 23, avg = 23 then reward = 1等等。

我为此算法开发了以下代码:

import numpy as np

rollouts = np.array([])
i = 0

def modify_reward(lst, rand):
reward = 1
constant1 = 0.25
constant2 = 1

std = np.std(lst)
global avg
avg = np.mean(lst)
sub = np.subtract(avg, rand)
landa = sub / std if std != 0 else 0
coefficient = -1 + ( 2 / (1 + np.exp(-constant2 * landa)))
md_reward = reward + (reward * constant1 * coefficient)
return md_reward

while i < 100:
rand = np.random.randint(15, 33)
rollouts = np.append(rollouts, rand)
modified_reward = modify_reward(rollouts, rand)
i += 1
print([i,rand, avg, modified_reward])

# test the reward for upper bound and lower bound

rand1, rand2 = 15, 32
reward1, reward2 = modify_reward(rollouts, rand1), modify_reward(rollouts, rand2)

print(['reward for upper bound', rand1, avg, reward1])
print(['reward for lower bound', rand2, avg, reward2])

该算法运行良好,但如果您查看下面的示例,您会发现算法存在问题。

rand = 15, avg = 23.94 然后 reward = 1.17 # 必须是 1.25

rand = 32, avg = 23.94 然后 reward = 0.84 # 必须是 0.75

rand = 15, avg = 27.38 然后 reward = 1.15 # 必须是 1.25

rand = 32, avg = 27.38 然后 reward = 0.93 # 必须是 0.75

您可能已经注意到,算法不考虑 avg 和边界 (15, 32) 之间的距离。avg 越接近下限或上限,modified_reward 越不平衡。

我需要modified_reward统一赋值,无论avg向上限还是下限移动。任何人都可以建议对该算法进行一些修改,以考虑 avg 和列表边界之间的距离。

最佳答案

将这两个要求放在一起:

if rand is more than average, we expect the reward to be less than 1, and if rand is less than average, the reward gets higher than 1.

I need modified_reward to be uniformly assigned, no matter avg moves toward upper bound or lower bound.

有点棘手,这取决于你所说的“一致”是什么意思。

如果您希望 15 人总是获得 1.25 的奖励,而 32 人总是获得 0.75 的奖励,那么您不能既有单一线性关系,同时又尊重您的第一个要求。

如果您对两个线性关系感到满意,您可以针对modified_reward 依赖于rand 的情况,如下所示:

enter image description here

我用 this Wolfram Alpha query 制作的.如您所见,这是两个 线性关系,在avg 处有一个“拐点”。我希望您能够毫不费力地推导出每个部分的公式。

关于python - 定义一个算法,它获取一个数字和一个列表,并根据数字与列表平均值的距离返回一个标量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46480727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com