首页 > 解决方案 > 如何根据 Python 中的最小值、最大值和可能值生成阶梯分布值?

问题描述

概率密度函数由三个参数定义:最小值、中值和最大值 [Codling 等人]。

在此处输入图像描述

我需要根据这些值生成分布值 (PDF) y = f(x)。我知道这个函数:numpy.heaviside,但不能正确使用。

示例:7.5 是最小值,11.4 是可能的,21.7 是最大值。

我的期望:

分布条件为 0.5,基于从 0 到 1 的 rand 样本。值范围从最小值到可能 [<0.5] 和可能到最大值 [>0.5]。例如:

如果随机样本低于 0.5,则该值必须在最小值范围内,如果样本高于 0.5,则该值必须从中值到最大值。

if sample = 0.35, then value has to be from 7.5 to 11.4

例如:

x = random.rand(size)

sample = []

for s in x:
    if s > 0.5:
        y = 2*(s-0.5)*(max-med)
        sample.append(y)
    else:
        y = 2*s*(med-min)
        sample.append(y)

但它永远不会达到最小值或最大值。

Codling et al., Probabilistic Well Time Estimation Using Operations Reporting Data

标签: pythonnumpymathprobability

解决方案


您是否要定义分段常数函数?

您可以通过组合几个np.heaviside功能来做到这一点:

def pdf1(x, minimum, median, maximum):
    h = np.heaviside
    return (
        h(x - minimum, 0) * h(-(x - median),  0) / (median - minimum) / 2
      + h(x - median,  0) * h(-(x - maximum), 0) / (maximum - median) / 2
    )

你也可以使用np.piecewise

def pdf2(x, minimum, median, maximum):
    return np.piecewise(
        x,
        [(minimum <= x) * (x < median), (median <= x) * (x < maximum)],
        [1 / (median - minimum) / 2, 1 / (maximum - median) / 2]
    )

例子:

>>> x = np.linspace(-3, 3, 20)
>>> minimum = -2
>>> median = -1
>>> maximum = 2
>>> pdf1(x, minimum, median, maximum)
[0.         0.         0.         0.         0.5        0.5
 0.5        0.16666667 0.16666667 0.16666667 0.16666667 0.16666667
 0.16666667 0.16666667 0.16666667 0.16666667 0.         0.
 0.         0.        ]
>>> pdf2(x, minimum, median, maximum)
[0.         0.         0.         0.         0.5        0.5
 0.5        0.16666667 0.16666667 0.16666667 0.16666667 0.16666667
 0.16666667 0.16666667 0.16666667 0.16666667 0.         0.
 0.         0.        ]

推荐阅读