我的目标是找到最短的间隔,其中我的概率密度函数下的面积等于0.2。我的PDF在区间[x_min,x_max]上是明确的。
这意味着,我想最小化功能
lambda x: x[1] - x[2]
满足这个条件:
1] x_max - x [1]> = 0
2] x [0] - x_min> = 0
3]从x [0]到x [1] - 0.2 = 0
的整合(PDF)这是我的代码:
from math import exp, log
from scipy.stats import logistic, norm
import numpy as np
from scipy.integrate import quad
from scipy.optimize import minimize
###################functions#################
#pdf function for logit
def pdf1(x_i, intercept, coef, x0):
a = (exp(intercept)*coef*((x_i + x0)**(coef - 1)))/(((exp(intercept)*
((x_i+x0)**coef)) + 1)**2)
return a
#pdf function for logistic distribution
def pdf2(x_i, mi, s):
return logistic.pdf(x_i, mi, s)
#pdf function for normal distribution
def pdf3(x_i, loc, scale):
return norm.pdf(x_i, loc = loc, scale = scale)
def pdf_point(x, p, const, params_logit, params_logistic, params_gauss):
p1, p2 = p
intercept, coef, x0 = params_logit
mi, s = params_logistic
loc, scale = params_gauss
a = const*(p1 * pdf1(x, intercept, coef, x0) + p2* pdf2(x, mi, s) + (1 - p1 - p2)*pdf3(x, loc, scale))
return a
def integrate_pdf(x, p, const, params_logit, params_logistic, params_gauss):
x1, x2 = x
return quad(pdf_point, x1, x2, args = (p, const, params_logit, params_logistic, params_gauss)) - 0.2
#############parameters#############
p = [ 0.22215561, 0.77784439]
const = 1.1514406903526164
params_logit = [-654.14149905436966, 109.50138530596364, 362.80446670967461]
params_logistic = (32.96514363428475, 2.8362675341927019)
params_gauss = (32.12488888888889, 5.4151936960216025)
mi = 18.0
ma = 38.399999999999999
##############code for my goal##############
con = ({"type" : "eq","fun" : integrate_pdf, "args" : (p, const, params_logit, params_logistic, params_gauss)},
{"type" : "ineq", "fun" : lambda x : x[0] - mi},{"type" : "ineq", "fun" : lambda x: ma - x[1]})
b = minimize(lambda x: x[1] - x[0], [1,1], method = "SLSQP", constraints = con)
不幸的是,它返回了我的错误,我不明白最新情况
这是错误:
return quad(pdf_point, x1, x2, args = (p, const, params_logit, params_logistic, params_gauss)) - 0.2
TypeError: unsupported operand type(s) for -: 'tuple' and 'float'