考虑非递减集合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}}
从图形上看,如下所示:
(来源:yootles.com)
我们现在寻求一条符合这些约束的曲线。
例如:
(来源:yootles.com)
让我们首先尝试通过约束的中点进行简单的插值:
mids = ({#1, Mean[{#2,#3}]}&) @@@ constraints
f = Interpolation[mids, InterpolationOrder->0]
绘制后,f 看起来像这样:
(来源:yootles.com)
该函数不是满射的。此外,我们希望它更流畅。
我们可以增加插值顺序,但现在它违反了其范围为 [0,1] 的约束:
(来源:yootles.com)
那么,目标是找到 smoothest function满足约束:
我在上面绘制的第一个例子似乎是一个很好的候选者,但我用 Mathematica 的 FindFit 做到了这一点。函数假设 lognormal CDF .
这在这个特定示例中效果很好,但通常不需要满足约束的对数正态 CDF。
最佳答案
我认为您没有指定足够的标准来使所需的 CDF 独一无二。
如果必须满足的唯一标准是:
那么也许你可以使用 Monotone Cubic Interpolation .
这会给你一个 C^2(两次连续可微)函数,
与三次样条不同,在给定单调数据时保证是单调的。
这留下了一个悬而未决的问题,究竟应该使用什么数据来生成
单调三次插值。如果取每个误差的中心点(平均值)
酒吧,您是否保证结果数据点是单调的
增加?如果没有,你不妨做出一些随意的选择来保证
您选择的点是单调增加的(因为标准并不强制我们的解决方案是唯一的)。
现在如何处理最后一个数据点?是否有一个 X 保证
比约束数据集中的任何 x 都大?也许你可以再次制作一个
任意选择方便并选择一些非常大的 X 并将 (X,1) 作为
最终数据点。
评论1:您的问题可以分解为 2 个子问题:
评论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/