Python 累积密度函数对某些分位数的最小二乘拟合

Python 累积密度函数对某些分位数的最小二乘拟合,python,scipy,Python,Scipy,假设一个用户给出了这样一个分布的某些百分位数,我们试图找到分布的参数 # a list of (p,x) tuples, where P(X<x)=p percentiles = [(0.2,8),(0.4,12),(0.5,16),(0.9,30)] 编辑:约翰指出,我认为最初的猜测很重要。下面是我用来从用户输入中获得参数初始猜测的(粗略)方法: def percentiles_to_list(percentiles): out =[] i = 1 c = 1

假设一个用户给出了这样一个分布的某些百分位数,我们试图找到分布的参数

# a list of (p,x) tuples, where P(X<x)=p
percentiles = [(0.2,8),(0.4,12),(0.5,16),(0.9,30)]
编辑:约翰指出,我认为最初的猜测很重要。下面是我用来从用户输入中获得参数初始猜测的(粗略)方法:

def percentiles_to_list(percentiles):
    out =[]
    i = 1
    c = 1
    for p,q in percentiles:
        if c == len(percentiles):
            number_to_append = int(100 - i)
        else:
            number_to_append = int(p*100-i)
        out += [q]*number_to_append
        i = p*100
        c += 1
    return out

def initial_guess(percentiles):
    lis = percentiles_to_list(percentiles)
    mean = np.mean(lis)
    stdev = np.std(lis)
    return mean,stdev

要获得良好的拟合,对的初始猜测很重要。这里,给定的50%百分位是
mu
的完美初始猜测。对于
sigma
,我们可以进行任何合理的初始猜测。默认猜测都是
1
s,在本例中这似乎太离谱了。除了(或代替)初始猜测,还可以为曲线拟合设置参数边界

注意,由于严格的单调函数,我们可以切换
x
y
的角色,以检查这是否会提供更令人满意的拟合

下面的代码尝试这两种拟合,并以图形方式显示结果。两者都相当强烈

从matplotlib导入pyplot作为plt
将numpy作为np导入
从scipy导入统计信息
从scipy导入优化

#(p,x)元组列表,其中p(XThanks,这是完美的。我刚刚有机会测试你的建议。
def percentiles_to_list(percentiles):
    out =[]
    i = 1
    c = 1
    for p,q in percentiles:
        if c == len(percentiles):
            number_to_append = int(100 - i)
        else:
            number_to_append = int(p*100-i)
        out += [q]*number_to_append
        i = p*100
        c += 1
    return out

def initial_guess(percentiles):
    lis = percentiles_to_list(percentiles)
    mean = np.mean(lis)
    stdev = np.std(lis)
    return mean,stdev