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

标签 algorithm probability fuzzy-logic

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

  • 我有一个计数器,我们称它为 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/

相关文章:

algorithm - 将字符串括起来,以便表达式采用给定值

algorithm - Rabin Karp算法的一点修改版本的可行性

matlab - 将列设置为 0,概率为 p

c++ - 根据其概率选择一个矩阵单元

java - 模糊逻辑域模型

arrays - 在 NASM Assembly 中递归添加数组中的所有元素

algorithm - 估计音频文件信噪比的方法?

neural-network - 如何从深度 CNN 输出创建不确定性彩色 map 图像?

c# - 模糊调度

python - 使用 Python/PIL 比较(相似)图像