scipy 用混合随机指数分布矩量法求参数λ

taor4pac  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(128)

如果我有两个随机指数分布,其中有一个特定的lambda,我混合了这两个分布,我如何用矩估计方法从混合分布中获得2个lambda,这是我到目前为止得到的:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from random import choice

n = 100
lambda1 = 10
lambda2 = 50

dataset1 = pd.DataFrame(np.random.default_rng().exponential(scale=(1/lambda1), size=n))
dataset2 = pd.DataFrame(np.random.default_rng().exponential(scale=(1/lambda2), size=n))

mixeddata = pd.concat([dataset1, dataset2])

bins = [5, 10, 25, 50]

fig, (ax1, ax2, ax3, ax4) = plt.subplots(4)

ax1.hist(mixeddata, bins=5, edgecolor='black', density=True)
ax2.hist(mixeddata, bins=10, edgecolor='black', density=True)
ax3.hist(mixeddata, bins=25, edgecolor='black', density=True)
ax4.hist(mixeddata, bins=50, edgecolor='black', density=True)

ax1.set_ylim(0, 1)
ax2.set_ylim(0, 1)
ax3.set_ylim(0, 1)
ax4.set_ylim(0, 1)

plt.show()

我做了两个随机指数分布的数据集,我混合了它们,绘制了不同箱的直方图。现在我想从中提取两个lambda。

1mrurvl1

1mrurvl11#

混合指数分布的前两个矩可以用混合概率p和速率参数lambda_1lambda_2表示。
均值和方差可以这样推导:

现在,您可以将这些表达式等同于混合数据的样本均值和方差,并求解得到的方程组。注意,这可能导致非线性方程组,这可能需要数值方法来求解。
我们可以使用SciPy库中的fsolve来求解方程组:

import numpy as np
from scipy.optimize import fsolve

# Assuming you have computed the sample mean and variance of your mixed data
sample_mean = mixeddata.mean().values[0]
sample_variance = mixeddata.var().values[0]

def equations(params):
    lambda1, lambda2, p = params
    eq1 = p * (1/lambda1) + (1-p) * (1/lambda2) - sample_mean
    eq2 = p * (1/(lambda1**2)) + (1-p) * (1/(lambda2**2)) + p*(1-p) * ((1/lambda1) - (1/lambda2))**2 - sample_variance
    # Assuming equal mixing probabilities for simplicity
    eq3 = p - 0.5
    return [eq1, eq2, eq3]

# Initial guesses for lambda1, lambda2, and p
initial_guesses = [10, 50, 0.5]
solutions, = fsolve(equations, initial_guesses)

lambda1_est, lambda2_est, p_est = solutions
print(f'Estimated Parameters: lambda1 = {lambda1_est}, lambda2 = {lambda2_est}, p = {p_est}')

相关问题