如何在 python 中正确拟合 beta 分布?

  • Post category:Python

在 Python 中拟合 Beta 分布可以使用 scipy.stats.beta 模块中的 fit 函数。

具体步骤如下:

Step 1:导入必要的库

import numpy as np
from scipy.stats import beta
from scipy.optimize import minimize

Step 2:准备数据

可以使用 numpy.random 模块生成 Beta 分布的数据,或者使用实际数据进行拟合。

a, b = 5, 2  # Beta 分布的参数
data = np.random.beta(a, b, size=1000)  # 生成 Beta 分布的数据

Step 3:定义拟合函数

我们将使用极大似然估计(MLE)来拟合 Beta 分布。由于 Beta 分布的概率密度函数比较复杂,在优化过程中可能会遇到求解失败的情况。为了防止这种情况发生,我们定义一个损失函数来代替概率密度函数。损失函数指的是预测值与实际值的差距,即拟合出来的 Beta 分布与实际数据之间的差异。在这里,我们使用最小二乘法来定义损失函数。具体实现如下:

def loss(params, a, b, data):
    alpha, beta = params
    return np.sum((beta.pdf(data, alpha, beta) - beta.pdf(data, a, b)) ** 2)

上述函数返回预测值和实际值的平方误差和。params 是待拟合的参数数组,ab 是 Beta 分布的原始参数,data 是实际数据。

Step 4:拟合 Beta 分布

params0 = [1, 1]  # 初始参数值
res = minimize(loss, params0, args=(a, b, data))  # 使用最小二乘法拟合
alpha, beta = res.x  # 拟合出来的参数值

minimize 函数将损失函数 loss 作为第一个参数传入,params0 是初始参数值,args=(a, b, data) 表示将参数 a、b 和数据 data 作为额外的参数传入损失函数中。res.x 返回拟合出来的参数值。

Step 5:验证拟合效果

可以使用 scipy.stats.beta 模块中的 pdf 函数绘制拟合出来的 Beta 分布。例如:

import matplotlib.pyplot as plt

x = np.linspace(0, 1, 100)
plt.hist(data, bins=20, density=True, alpha=0.5, label='original data')
plt.plot(x, beta.pdf(x, a, b), 'r-', lw=2, alpha=0.6, label='original beta')
plt.plot(x, beta.pdf(x, alpha, beta), 'b-', lw=2, alpha=0.6, label='fitted beta')
plt.legend()
plt.show()

其中,x 是横坐标,bins 是直方图的柱子数量,alpha 是柱子的透明度,label 是标签。

最后,如果预测结果与实际数据之间的误差过大,可以采用一些常见的调参技巧,如更改初始参数、增加迭代次数等等。