SciPy 单变量样条平滑条件

问题描述 投票:0回答:1

我正在使用 SciPy 中的 UnivariateSpline,在我看来,它为平滑条件(对于 s 参数)给出的

second
公式是不正确的。

它给出的第一个公式来决定何时停止向样条线添加结似乎很好:

sum((w[i] * (y[i]-spl(x[i])))**2, axis=0) <= s

这很好(尽管由于

i
和使用 Numpy sum,语法不是正确的 Python 代码)。

在陈述完上述公式后,他们接着说:“但是,由于数值问题,实际情况是”,并给出了第二个公式

abs(sum((w[i] * (y[i]-spl(x[i])))**2, axis=0) - s) < 0.001 * s

这对我来说似乎根本不正确。 (如果你关心的话,我是一名数学家。)问题如下。将误差定义为

error = sum((w[i] * (y[i]-spl(x[i])))**2, axis=0)

他们的第二个公式是这样的

abs(error - s) < 0.001 * s

这(从数学上来说)与所说的相同

0.999 * s < error < 1.001 * s

这意味着

error
大约为
s
。将此与他们的第一个公式进行对比,该公式只是说
error <= s

我错过了什么,还是他们的第二个公式并不是真正的平滑停止条件?

看来对绝对值函数的调用不应该在那里。如果没有它,我修改后的第二个公式将相当于这个(这对我来说更有意义):

error < 1.001 * s

我检查了他们关于停止条件的声明,发现错误有时会超出区间

0.999 * s < error < 1.001 * s

from scipy.interpolate import UnivariateSpline
x = range(4)
y = [0.01, 1.01, 2.01, 3.01]
spl = UnivariateSpline(x, y, s=1)
print(spl(x))
print(sum((yi-spl(xi))**2 for xi, yi in zip(x,y)))    
# prints this:
#[0.01 1.01 2.01 3.01]
#3.6412113011071178e-34

我尝试查找源代码并找到了 UnivariateSpline 类,但在我看来,他们算法的核心是对

dfitpack.fpcurf0
的调用,我还没有找到其源代码。

python scipy spline
1个回答
0
投票

谢谢大家的评论。我确实在 GitHub 上创建了一个问题。 他们表示问题在于文档中有一个拼写错误,其中 0.001 应该是 1.001。

© www.soinside.com 2019 - 2024. All rights reserved.