想象一个模拟实验,其中输出是n 个总数,其中k个是从具有速率a的指数随机变量中采样的,而nk是从具有速率b的指数随机变量中采样的。约束条件是 0 < a ≤ b和 0 ≤ k ≤ n,但a、b和k都是未知的。此外,由于模拟实验的细节,当a << b时,k ≈ 0,而当a = b时,k ≈ n /2。
我的目标是估计a或b(不关心k,我不需要同时估计a和b:两者之一就可以了)。从推测来看,似乎只估计b可能是最简单的路径(当a << b时,几乎没有什么可用于估计a并且有很多可用于估计b,而当a = b时,两者仍然有很多估计b )。理想情况下,我想用 Python 来做,但我对任何免费软件都持开放态度。
我的第一种方法是使用sklearn.optimize
优化似然函数,对于我的数据集中的每个数字,我计算 P(X=x) 的指数为a,计算相同的指数为b,然后简单地选择较大的两者中的:
from sys import stdin
from math import exp,log
from scipy.optimize import fmin
DATA = None
def pdf(x,l): # compute P(X=x) for an exponential rv X with rate l
return l*exp(-1*l*x)
def logML(X,la,lb): # compute the log-ML of data points X given two exponentials with rates la and lb where la < lb
ml = 0.0
for x in X:
ml += log(max(pdf(x,la),pdf(x,lb)))
return ml
def f(x): # objective function to minimize
assert DATA is not None, "DATA cannot be None"
la,lb = x
if la > lb: # force la <= lb
return float('inf')
elif la <= 0 or lb <= 0:
return float('inf') # force la and lb > 0
return -1*logML(DATA,la,lb)
if __name__ == "__main__":
DATA = [float(x) for x in stdin.read().split()] # read input data
Xbar = sum(DATA)/len(DATA) # compute mean
x0 = [1/Xbar,1/Xbar] # start with la = lb = 1/mean
result = fmin(f,x0,disp=DISP)
print("ML Rates: la = %f and lb = %f" % tuple(result))
不幸的是,这并没有很好地工作。对于某些参数选择,它在一个数量级之内,但对于其他参数,它是荒谬的。鉴于我的问题(有其约束)和我估计两个指数的较大参数的目标(不关心较小的参数或来自任何一个的点数),有什么想法吗?