曲线拟合:找到满足约束列表的最流畅的函数

dre*_*ves 7 math plot wolfram-mathematica curve-fitting cdf

考虑从(-inf,inf)到[0,1] 的非递减主观(上)函数的集合.(典型的CDF满足该属性.)换句话说,对于任何实数x,0 <= f(x)<= 1. 逻辑函数可能是最着名的例子.

我们现在以x值列表的形式给出一些约束,并且对于每个x值,给出一对函数必须介于其间的y值.我们可以将其表示为{x,ymin,ymax}三元组列表,例如

constraints = {{0, 0, 0}, {1, 0.00311936, 0.00416369}, {2, 0.0847077, 0.109064}, 
 {3, 0.272142, 0.354692}, {4, 0.53198, 0.646113}, {5, 0.623413, 0.743102}, 
 {6, 0.744714, 0.905966}}
Run Code Online (Sandbox Code Playgroud)

图形上看起来像这样:

对cdf的约束http://yootles.com/outbox/cdffit1.png

我们现在寻求一条尊重这些约束的曲线.例如:

适合cdf http://yootles.com/outbox/cdffit2.png

让我们首先尝试通过约束的中点进行简单插值:

mids = ({#1, Mean[{#2,#3}]}&) @@@ constraints
f = Interpolation[mids, InterpolationOrder->0]
Run Code Online (Sandbox Code Playgroud)

Plotted,f看起来像这样:

插值cdf http://yootles.com/outbox/cdffit3.png

这个功能不是满足的.此外,我们希望它更顺畅.我们可以增加插值顺序,但现在它违反了其范围为[0,1]的约束:

具有更高插值顺序的插值cdf http://yootles.com/outbox/cdffit4.png

那么,目标是找到满足约束条件的最平滑的函数:

  1. 非减.
  2. 当x接近负无穷大时倾向于0,当x接近无穷大时倾向于1.
  3. 通过给定的y-error-bars列表.

我上面绘制的第一个例子似乎是一个很好的候选者,但是我使用Mathematica的FindFit函数假设一个对数正态CDF.这在这个具体示例中效果很好,但通常不需要满足约束的对数正态CDF.

unu*_*tbu 5

我认为你没有指定足够的标准来使所需的CDF独一无二.

如果必须遵守的唯一标准是:

  1. CDF必须"相当顺利"(见下文)
  2. CDF必须不减少
  3. CDF必须通过"错误条"y间隔
  4. CDF必须倾向于0作为x - > - 无限
  5. CDF必须倾向于1为x - >无穷大.

那么也许你可以使用Monotone Cubic Interpolation.这将给你一个C ^ 2(两次连续可微)函数,与单位样条函数不同,在给定单调数据时保证单调.

这留下了一个问题,确切地说,您应该使用哪些数据来生成单调立方插值.如果你取每个误差条的中心点(平均值),你能保证得到的数据点是单调递增的吗?如果没有,您可以做出一些任意选择,以保证您选择的点单调增加(因为标准不会强制我们的解决方案是唯一的).

现在该如何处理最后一个数据点?是否有一个X保证大于约束数据集中的任何x?也许你可以再次选择方便性并选择一些非常大的X并将(X,1)作为最终数据点.

评论1:您的问题可以分为两个子问题:

  1. 给定CDF必须通过的精确点(x_i,y_i),如何生成CDF?我怀疑有无限多种可能的解决方案,即使有无限平滑约束.

  2. 给定y-errorbars,你应该如何选择(x_i,y_i)?同样,有无限多种可能的解决方案.可能需要添加一些额外的标准来强制进行独特的选择.其他标准也可能使问题比现在更难.

注释2:这是一种使用单调三次插值的方法,并满足标准4和5:

单调三次插值(姑且称之为f)映射[R - > [R .

我们CDF(x) = exp(-exp(f(x))).然后CDF: R --> (0,1).如果我们能找到合适的f,那么通过定义CDF这种方式,我们就可以满足标准4和5.

要了解f,改造CDF限制(x_0,y_0),...,(x_n,y_n)使用转变xhat_i = x_i,yhat_i = log(-log(y_i)).这是CDF转型的反面.如果它们y_i正在增加,那么yhat_i它们正在减少.

现在将单调三次插值应用于(x_hat,y_hat)数据点以生成f.最后,定义CDF(x) = exp(-exp(f(x))).这将是R - >(0,1)的单调递增函数,它通过点(x_i,y_i).

我认为,这符合所有标准2--5.标准1有些满意,但肯定可以存在更平滑的解决方案.


i_a*_*orf 0

您可以尝试通过中点拟合贝塞尔曲线。具体来说,我认为你想要一条C2 连续曲线。