使用三次函数插值得出概率为负值

时间:2019-07-05 13:03:14

标签: python-3.x scipy interpolation

我有一组数据,分别对应于沿x轴的年龄(以0.1为步长)和沿y轴的概率。我正在尝试对数据进行插值,以便找到可以覆盖95%概率的最大年龄段。

我尝试使用下面的代码(从SciPy帮助页面获取)进行简单的插值,除一个功能外,它产生了很好的结果(我更改x和y变量以读取我的数据)。

from scipy.interpolate import interp1d

x = np.linspace(72, 100, num=29, endpoint=True)
y = df.iloc[:,0].values
f = interp1d(x, y)
f2 = interp1d(x, y, kind='cubic')

xnew = np.linspace(0, 10, num=41, endpoint=True)
import matplotlib.pyplot as plt
plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--')
plt.legend(['data', 'linear', 'cubic'], loc='best')
plt.show()

问题在于,三次函数最适合且最平滑。但是,它为概率曲线的某些部分提供了负值,这显然是不可接受的。有什么方法可以将底线设置为y = 0?我以为也许改用二次方可以解决问题,但事实并非如此。线性拟合可以,但是不能平滑,因此不是很好的匹配。

我也不确定如何执行我想做的第二部分。这可能很简单,但是当我没有频率表时,我不知道如何找到均值,而没有形成函数的内插点网格。如果我知道该函数,则可以将其集成,但是我不确定如何在Python中做到这一点。

编辑以包含一些数据:

这是我的y数据的样子:

array([3.41528917e-08, 7.81041275e-05, 9.60711716e-04, 5.75868934e-05,
       6.50260297e-05, 2.95556411e-05, 2.37331370e-05, 9.11990619e-05,
       1.08003254e-04, 4.16800419e-05, 6.63673113e-05, 2.57934035e-04,
       3.42235937e-03, 5.07534495e-03, 1.76603165e-02, 1.69535370e-01,
       2.67624254e-01, 4.29420872e-01, 8.25165926e-02, 2.08367339e-02,
       2.01227453e-03, 1.15405995e-04, 5.40163098e-07, 1.66905537e-10,
       8.31862858e-18, 4.14093219e-23, 8.32103362e-29, 5.65637769e-34,
       7.93547444e-40])

0 个答案:

没有答案