在 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
是待拟合的参数数组,a
和 b
是 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
是标签。
最后,如果预测结果与实际数据之间的误差过大,可以采用一些常见的调参技巧,如更改初始参数、增加迭代次数等等。