用总和和最小值约束对实数进行采样



如何采样 n 随机值以使以下约束满足?

  1. n 值总计为1.0
  2. 没有一个值小于0.01(或其他一些阈值 t << 1/ n ((

以下过程是我的第一次尝试。

def proportions(N):
    proportions = list()
    for value in sorted(numpy.random.random(N - 1) * 0.98 + 0.01):
        prop = value - sum(proportions)
        proportions.append(prop)
    prop = 1.0 - sum(proportions)
    proportions.append(prop)
    return proportions

* 0.98 + 0.01位旨在执行≥1%的约束。如果两个随机值的距离为&lt,则可以在边距上起作用,但在内部不起作用。0.01未捕获/更正。示例:

>>> numpy.random.seed(2000)                                                                                            
>>> proportions(5)                                                                                                     
[0.3397481983960182, 0.14892479749759702, 0.07456518420712799, 0.005868759570153426, 0.43089306032910335]

任何建议修复这种破裂方法或用更好的方法替换它的建议?

您可以改编Mark Dickinson的好解决方案:

import random
def proportions(n):
    dividers = sorted(random.sample(range(1, 100), n - 1))
    return [(a - b) / 100 for a, b in zip(dividers + [100], [0] + dividers)]
print(proportions(5))
# [0.13, 0.19, 0.3, 0.34, 0.04]
# or
# [0.31, 0.38, 0.12, 0.05, 0.14]
# etc

请注意,该假设"没有任何值小于0.01"是固定阈值

update :如果我们采用阈值的倒数,我们可以将其推广,并用它来替换建议的代码中的硬编码100值。

def proportions(N, T=0.01):
    limit = int(1 / T)
    dividers = sorted(random.sample(range(1, limit), N - 1))
    return [(a - b) / limit for a, b in zip(dividers + [limit], [0] + dividers)]

呢?

  • n/2次,选择一个随机数x,以便1/n x&1/n-X适合您的约束;添加1/N X&1/n-x
  • 如果n是奇数,请添加1/n

最新更新