python - 如何根据 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
解决方案
您是否要定义分段常数函数?
您可以通过组合几个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. ]
推荐阅读
- php - 从mysql db中获取具有多值列条件的行以搜索多值
- javascript - 如何用对话框和承诺 JS 替换提示
- python - 需要检查容器是否正在运行
- neo4j - Neo4J 中的幂等性检查
- ios - Cordova iOS 通用链接问题
- java - 使用和公开 REST 服务并传递 JSON 正文
- amazon-web-services - AWS Cognito 密码过期
- javascript - 如何在不将 HTML 元素包装在 Javascript 中的情况下将第一个单词包装在字符串中?
- node.js - node.js Socket传输重叠
- javascript - 无法使用 node.js 保存到 mongodb