gpt4 book ai didi

python - 在 scipy.insterpolate 的 splrep 函数上选择节点的错误(?)

转载 作者:行者123 更新时间:2023-11-28 16:45:17 25 4
gpt4 key购买 nike

我有一个关于 scipy 的 splrep 函数的问题,我认为这是一个错误,所以我将发布每段代码,以便您可以在您的计算机上重现它。假设我想找到一些数据的 b 样条表示,例如,通过以下代码获得的数据,它创建了一个数据集,该数据集由 10 个高斯分布和一些添加的噪声混合而成:

import numpy as np
# First we define the number of datapoints:
ndata = 100
x = np.arange(0,1,1./np.double(ndata))
means = np.random.uniform(0,1,10)
y = 0.0
for i in range(len(means)):
y = y+np.exp(-(x-means[i])**2./0.01)
# We add some noise to obtain the data:
data = y + np.random.normal(0,0.05,len(y))

应该是这样的: Noisy data and the true curve (mixture of gaussians)现在,让我们使用 splrep 和 splev 函数来获得该曲线的 b 样条表示:

from scipy.interpolate import splrep,splev
# First define the number of knots. Let's put, say, 10 knots:
nknots = 10
# Now we crate the array of knots:
knots = np.arange(x[1],x[len(x)-1],(x[len(x)-1]-x[1])/np.double(nknots))
tck = splrep(x,data,t=knots)
fit = splev(x,tck)

如果你绘制到这里的所有内容,一切似乎都很好: Fit with b-splines但是,数据点数量和节点数量的某些组合存在问题。例如,如果您使用 ndata = 1931nknots = 796 尝试上面的代码,我会收到以下错误:

File "/usr/lib/python2.7/dist-packages/scipy/interpolate/fitpack.py", line 465, in
splrep raise _iermess[ier][1](_iermess[ier][0])
ValueError: Error on input data

这给我带来了问题,因为上面的代码是不可自动化的。我正在处理具有约 19000 个数据点的数据集,其中使用 tryexceptwhile 循环在计算上要求很高。所以我的问题是:

  1. 你能重现这个问题吗?如果你能……
  2. 你知道发生了什么事吗?

最佳答案

我找到了解决问题的方法。它可能与适合两个结之间的少量数据点有关,所以我所做的是用以下代码替换我创建结数的行:

idx_knots = (np.arange(1,len(x)-1,(len(x)-2)/np.double(nknots))).astype('int')
knots = x[idx_knots]

通过这种方式,我确保节点之间有足够的数据点,因为我使用了 x 向量的索引。

关于python - 在 scipy.insterpolate 的 splrep 函数上选择节点的错误(?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14533908/

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