gpt4 book ai didi

python - scipy.interpolate.UnivariateSpline 不平滑,无论参数如何

转载 作者:太空宇宙 更新时间:2023-11-03 12:22:11 24 4
gpt4 key购买 nike

我无法让 scipy.interpolate.UnivariateSpline 在插值时使用任何平滑。基于function's page以及一些previous posts ,我相信它应该使用 s 参数提供平滑。

这是我的代码:

# Imports
import scipy
import pylab

# Set up and plot actual data
x = [0, 5024.2059124920379, 7933.1645067836089, 7990.4664106277542, 9879.9717114947653, 13738.60563208926, 15113.277958924193]
y = [0.0, 3072.5653360000988, 5477.2689107965398, 5851.6866463790966, 6056.3852496014106, 7895.2332350173638, 9154.2956175610598]
pylab.plot(x, y, "o", label="Actual")

# Plot estimates using splines with a range of degrees
for k in range(1, 4):
mySpline = scipy.interpolate.UnivariateSpline(x=x, y=y, k=k, s=2)
xi = range(0, 15100, 20)
yi = mySpline(xi)
pylab.plot(xi, yi, label="Predicted k=%d" % k)

# Show the plot
pylab.grid(True)
pylab.xticks(rotation=45)
pylab.legend( loc="lower right" )
pylab.show()

结果如下:

Splines without smoothing

我已经尝试使用一系列 s 值(0.01、0.1、1、2、5、50)以及显式权重,设置为相同的值 (1.0) 或随机的。我仍然无法进行任何平滑处理,结数始终与数据点数相同。特别是,我正在寻找像第 4 个点 (7990.4664106277542、5851.6866463790966) 这样的异常值以进行平滑处理。

是因为我没有足够的数据吗?如果是这样,是否可以应用类似的样条函数或聚类技术来实现对这几个数据点的平滑处理?

最佳答案

简答:您需要选择 s 的值更仔细。

UnivariateSpline 的文档指出:

Positive smoothing factor used to choose the number of knots. Number of 
knots will be increased until the smoothing condition is satisfied:
sum((w[i]*(y[i]-s(x[i])))**2,axis=0) <= s

从这个可以推断出平滑的“合理”值,如果你不传递明确的权重,大约是 s = m * v其中 m是数据点的数量,v数据的方差。在这种情况下,s_good ~ 5e7 .

编辑:s 的合理值当然也取决于数据中的噪声水平。文档似乎建议选择 s(m - sqrt(2*m)) * std**2 <= s <= (m + sqrt(2*m)) * std**2 范围内其中 std是与您要平滑的“噪声”相关联的标准差。

关于python - scipy.interpolate.UnivariateSpline 不平滑,无论参数如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8719754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com