【发布时间】:2017-07-15 16:52:30
【问题描述】:
想象一个模拟实验,其中输出是 n 个总数,其中 k 个是从具有 a率的指数随机变量中采样的> 和 n-k 是从具有 b 率的指数随机变量中采样的。约束条件是 0 a ≤ b 和 0 ≤ k ≤ n,但是 a, b 和 k 都是未知的。此外,由于模拟实验的细节,当a ,k ≈ 0,当a = b, k ≈ n/2.
我的目标是估计 a 或 b (不关心 k,我不需要同时估计两者a 和 b:两者之一即可)。从推测来看,似乎只估计 b 可能是最简单的路径(当 a 时,几乎没有什么可用于估计 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))
不幸的是,这并没有很好地工作。对于某些参数选择,它在一个数量级之内,但对于其他参数,它是荒谬的。鉴于我的问题(有其约束)和我估计两个指数的较大参数的目标(不关心较小的参数,也不关心来自任何一个的点数),有什么想法吗?
【问题讨论】:
标签: python scikit-learn statistics estimation exponential-distribution