math - 曲线拟合 : Find the smoothest function that satisfies a list of constraints

标签 math plot wolfram-mathematica curve-fitting cdf

考虑非递减集合surjective (onto) 从 (-inf,inf) 到 [0,1] 的函数。
(典型的 CDF s 满足此属性。)
换句话说,对于任何实数 x,0 <= f(x) <= 1。
logistic function也许是最著名的例子。

我们现在以 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}}

从图形上看,如下所示:

constraints on a cdf
(来源:yootles.com)

我们现在寻求一条符合这些约束的曲线。
例如:

fitted cdf
(来源:yootles.com)

让我们首先尝试通过约束的中点进行简单的插值:
mids = ({#1, Mean[{#2,#3}]}&) @@@ constraints
f = Interpolation[mids, InterpolationOrder->0]

绘制后,f 看起来像这样:

interpolated cdf
(来源:yootles.com)

该函数不是满射的。此外,我们希望它更流畅。
我们可以增加插值顺序,但现在它违反了其范围为 [0,1] 的约束:

interpolated cdf with higher interpolation order
(来源:yootles.com)

那么,目标是找到 smoothest function满足约束:
  • 不减。
  • 当 x 接近负无穷大时趋于 0,当 x 趋近无穷大时趋于 1。
  • 通过给定的 y 误差条列表。

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

    最佳答案

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

    如果必须满足的唯一标准是:

  • CDF 必须“相当平滑”(见下文)
  • CDF 必须是非递减的
  • CDF 必须通过“误差条”y 区间
  • 当 x --> -Infinity 时,CDF 必须趋向于 0
  • 当 x --> Infinity 时,CDF 必须趋向于 1。

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

    这留下了一个悬而未决的问题,究竟应该使用什么数据来生成
    单调三次插值。如果取每个误差的中心点(平均值)
    酒吧,您是否保证结果数据点是单调的
    增加?如果没有,你不妨做出一些随意的选择来保证
    您选择的点是单调增加的(因为标准并不强制我们的解决方案是唯一的)。

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

    评论1:您的问题可以分解为 2 个子问题:
  • 给定 CDF 必须通过的确切点 (x_i,y_i),如何生成 CDF?我怀疑有无限多个可能的解决方案,即使有无限平滑约束。

  • 给定 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 有点满足,尽管肯定可以存在更平滑的解决方案。

    关于math - 曲线拟合 : Find the smoothest function that satisfies a list of constraints,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2702410/

    相关文章:

    algorithm - 给定一个整数 z<=10^100,找到包含 z 的帕斯卡三角形的最小行

    mysql - 实现地理空间/邻近搜索需要什么?

    用于代数、数学的 Java/Scala 库

    r - 向外移动曲线上绘制的一系列数字

    wolfram-mathematica - 创建特定长度的列表和向量

    r - 如何在 rmarkdown 中正确对齐数学方程?

    python - Bokeh :保存绘图(作为 HTML)但不显示

    matlab - matlab 图中的子图标签

    wolfram-mathematica - Mathematica 8中带有函数声明的问题

    list - 如何获取列表中的所有其他项目