使用 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)
splrep文档指出weight 参数的默认值为np.ones(len(x))
. 但是,绘制此图会导致完全不同的图:
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 对此进行了测试。带有测试 IPython 笔记本的要点