scipy 权重不符合给定曲线的 splrep()
scipy splrep() with weights not fitting the given curve
使用 scipy 的 splrep 我可以轻松地拟合测试正弦波:
import numpy as np
from scipy.interpolate import splrep, splev
import matplotlib.pyplot as plt
plt.style.use("ggplot")
# Generate test sinewave
x = np.arange(0, 20, .1)
y = np.sin(x)
# Interpolate
tck = splrep(x, y)
x_spl = x + 0.05 # Just to show it wors
y_spl = splev(x_spl, tck)
plt.plot(x_spl, y_spl)
weight参数默认值为np.ones(len(x))
的splrep documentation states。但是,将其绘制成完全不同的图:
tck = splrep(x, y, w=np.ones(len(x_spl)))
y_spl = splev(x_spl, tck)
plt.plot(x_spl, y_spl)
文档还指出,当给定权重数组时,平滑条件 s
是不同的 - 但即使设置 s=len(x_spl) - np.sqrt(2*len(x_spl))
(没有权重数组的默认值),结果也不严格对应于图中所示的原始曲线。
我需要在上面列出的代码中更改什么才能使使用权重数组(如上所列)的插值输出与不使用权重的插值相同的结果?
我用 scipy 0.17.0 测试过这个。 Gist with a test IPython notebook
您只需更改一行代码即可获得相同的输出:
tck = splrep(x, y, w=np.ones(len(x_spl)))
应该变成
tck = splrep(x, y, w=np.ones(len(x_spl)), s=0)
因此,唯一的区别是您必须指定 s
而不是使用默认值。
当您查看 splrep
的 source code 时,您会明白为什么需要这样做:
if w is None:
w = ones(m, float)
if s is None:
s = 0.0
else:
w = atleast_1d(w)
if s is None:
s = m - sqrt(2*m)
这意味着,如果既未提供权重也未提供 s
,则 s
设置为 0,如果您提供权重但未提供 s
,则 s = m - sqrt(2*m)
其中 m = len(x)
.
因此,在上面的示例中,您比较了具有相同权重但具有不同 s
(分别为 0
和 m - sqrt(2*m)
)的输出。
使用 scipy 的 splrep 我可以轻松地拟合测试正弦波:
import numpy as np
from scipy.interpolate import splrep, splev
import matplotlib.pyplot as plt
plt.style.use("ggplot")
# Generate test sinewave
x = np.arange(0, 20, .1)
y = np.sin(x)
# Interpolate
tck = splrep(x, y)
x_spl = x + 0.05 # Just to show it wors
y_spl = splev(x_spl, tck)
plt.plot(x_spl, y_spl)
weight参数默认值为np.ones(len(x))
的splrep documentation states。但是,将其绘制成完全不同的图:
tck = splrep(x, y, w=np.ones(len(x_spl)))
y_spl = splev(x_spl, tck)
plt.plot(x_spl, y_spl)
文档还指出,当给定权重数组时,平滑条件 s
是不同的 - 但即使设置 s=len(x_spl) - np.sqrt(2*len(x_spl))
(没有权重数组的默认值),结果也不严格对应于图中所示的原始曲线。
我需要在上面列出的代码中更改什么才能使使用权重数组(如上所列)的插值输出与不使用权重的插值相同的结果? 我用 scipy 0.17.0 测试过这个。 Gist with a test IPython notebook
您只需更改一行代码即可获得相同的输出:
tck = splrep(x, y, w=np.ones(len(x_spl)))
应该变成
tck = splrep(x, y, w=np.ones(len(x_spl)), s=0)
因此,唯一的区别是您必须指定 s
而不是使用默认值。
当您查看 splrep
的 source code 时,您会明白为什么需要这样做:
if w is None:
w = ones(m, float)
if s is None:
s = 0.0
else:
w = atleast_1d(w)
if s is None:
s = m - sqrt(2*m)
这意味着,如果既未提供权重也未提供 s
,则 s
设置为 0,如果您提供权重但未提供 s
,则 s = m - sqrt(2*m)
其中 m = len(x)
.
因此,在上面的示例中,您比较了具有相同权重但具有不同 s
(分别为 0
和 m - sqrt(2*m)
)的输出。