python - Python 给定范围内值的指数分布

标签 python statistics distribution exponential-distribution data-transform

我有三个变量 Min=0.29、Max=6.52 和 center = 2.10。我希望创建一个表,以以下方式将这些数据分配为表格式的 100 个值:

enter image description here

这里,该图像可以分为两部分:0 到 50 和 50 到 100。

在第一部分中,后续值的 x 与 y 的增量在 1-10 与 10-20 之间较高,在 10-20 与 20-30 之间较高,依此类推。

在第二部分中,后续值的 x 与 y 的增量在 50-60 与 60-70 之间较低,在 60-70 与 70-80 之间较低,依此类推。

现在,我对统计的熟练程度不高,因此无法弄清楚如何为指数分布提供最小值、最大值和中心值以及如何在 python 中实现它。

我尝试使用 link 中给出的解决方案,但无法让它适用于我的情况。任何帮助将不胜感激。

最佳答案

这两个指数函数均由 3 个参数定义,但每个函数只有 2 个点。一种可能性是为两个函数提供渐近值。由于时间不够,我将在这里粘贴我的代码,包括所有公式的推导 - 抱歉:

from math import exp, log
from matplotlib import pyplot as plt

X_MIN, X_CTR, X_MAX = 1, 50, 100
Y_MIN, Y_CTR, Y_MAX = 0.29, 2.10, 6.52

c1 = float(input(f"c1 (> {Y_CTR}): "))
c2 = float(input(f"c2 (< {Y_CTR}): "))
plot = input("plot? (y|n): ")[:1] in "yY"

# c1 - a1 * exp(-b1 * X_MIN) == Y_MIN  # with a1 > 0, b1 > 0, c1 > Y_CTR
# c1 - a1 * exp(-b1 * X_CTR) == Y_CTR
# c2 + a2 * exp( b2 * X_CTR) == Y_CTR  # with a2 > 0, b2 > 0, c2 < Y_CTR
# c2 + a2 * exp( b2 * X_MAX) == Y_MAX

# a1 * exp(-b1 * X_MIN) == c1 - Y_MIN
# a1 * exp(-b1 * X_CTR) == c1 - Y_CTR
# a2 * exp( b2 * X_CTR) == Y_CTR - c2
# a2 * exp( b2 * X_MAX) == Y_MAX - c2

# log(a1) - b1 * X_MIN == log(c1 - Y_MIN)
# log(a1) - b1 * X_CTR == log(c1 - Y_CTR)
# log(a2) + b2 * X_CTR == log(Y_CTR - c2)
# log(a2) + b2 * X_MAX == log(Y_MAX - c2)

# b1 * (X_CTR - X_MIN) == log(c1 - Y_MIN) - log(c1 - Y_CTR)
# b2 * (X_MAX - X_CTR) == log(Y_MAX - c2) - log(Y_CTR - c2)

b1 = (log(c1 - Y_MIN) - log(c1 - Y_CTR)) / (X_CTR - X_MIN)
b2 = (log(Y_MAX - c2) - log(Y_CTR - c2)) / (X_MAX - X_CTR)

# log(a1) == log(c1 - Y_MIN) + b1 * X_MIN
# log(a2) == log(Y_MAX - c2) - b2 * X_MAX

a1 = exp(log(c1 - Y_MIN) + b1 * X_MIN)
a2 = exp(log(Y_MAX - c2) - b2 * X_MAX)

x_lst = list(range(X_MIN, X_MAX+1))
y_lst = [c1 - a1 * exp(-b1 * x) if x < X_CTR else
         c2 + a2 * exp( b2 * x) for x in x_lst]

if plot:
    plt.plot(x_lst, y_lst)
    plt.grid(True)
    plt.show()
else:
    for x, y in zip(x_lst, y_lst):
        print(f"{x},{y:.14}")

例如,使用此输入:

c1 (> 2.1): 2.13
c2 (< 2.1): 2.08
plot? (y|n): y

输出是: plot

关于python - Python 给定范围内值的指数分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58562012/

相关文章:

python - 如何在不使用 tkinter 的情况下在 python 中打开保存文件对话框

python - 截断 SciPy 随机分布

python - 有没有办法在python中测量多维空间中两个分布之间的距离?

python - 如何在django中检测当前域名?

python - 快速切片数据集并存储在新的数据框中?

python - 如何简化 python 中分布的列表理解

r - 如何在 gnuplot 生成的 cdf 上绘制引导线?

c - C 中的随机整数,rand()%N 与整数运算相比有多糟糕?它的缺陷是什么?

iphone - 团队代理是唯一可以构建 Ad Hoc 的代理吗?

python - 在Python中解析XML : Multiple same attributes