gpt4 book ai didi

algorithm - 可变数量的集合之间的模糊选择

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:11:16 26 4
gpt4 key购买 nike

我想知道在以下情况下,哪种方法是获取我需要的最简单和最可配置的方法:

  • 我有一个计数器,我们称它为 X,它将用于提取其中一个集合
  • 我有可变数量的集合 S1, S2, .. 可以考虑 total ordered他们之间
  • 我想以一种模糊的方式混合这些集合,这样对于 X = 0 它将给我 S1,比方说,X = 20 它会给我 S1 70% 的机会,S2 30% 的机会
  • 增加 X 会将 S1 的概率降低到 0%,同时将 S2 增加到 100%,然后可以有一个区域,其中它总是给我 S2直到 S2 开始下降并且 S3 开始获得机会的新阈值,依此类推

我知道如何通过硬编码一切来做到这一点,但由于它需要一些调整,我想应用一个解决方案,它可以轻松地让我配置我有多少组和单个阈值(增加概率的开始/结束和减少概率的开始/结束)。当然,我不需要超过 2 个集合之间的任何交集,概率的线性增加/减少是可以的。有什么好的线索吗?

提前致谢!

最佳答案

要分配概率分布,您可以使用 Bernstein 多项式:

http://en.wikipedia.org/wiki/Bernstein_polynomial

这些可以使用 de Casteljau 算法有效地计算(基本上它以明显的方式在递归上执行 DP):

http://en.wikipedia.org/wiki/De_Casteljau 's_algorithm

http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/de-casteljau.html

您得到的结果将是分布的一组权重。要选择其中一个集合,您只需在 [0,1] 中生成一个统一的随机变量,然后根据这些权重选择它所在的集合。

这是执行此操作的 python 中的一些代码:

import random

#Selects one of the n sets with a weight based on x
def pick_a_set(n, x):

#Compute bernstein polynomials
weights = [ [ float(i == j) for j in range(n) ] for i in range(n) ]
for k in range(n):
for j in range(n-k-1):
for i in range(n):
weights[j][i] = weights[j][i] * (1.0 - x) + weights[j+1][i] * x

#Select using weights
u = random.random()
for k in range(n):
if u < weights[0][k]:
return k
u -= weights[0][k]
return 0

关于algorithm - 可变数量的集合之间的模糊选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6475396/

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