Scipy样条插值:在实际计算前确定tck中knots/B样条系数向量的数组长度
Scipy spline interpolation: Determine array length of vector of knots / B-spline coefficients in tck before actual computation
是否有可能在计算值之前确定 scipy.interpolate.splprep
返回的 tck
元组中数组的数组长度?
我必须将样条插值拟合到具有 500 万个数据点(或更少,可以变化)的噪声数据。
我的观察是,数组长度为 ~ 90 的插值非常好,而计算更高数组长度的插值需要很长时间(它有时也会直接从 ~ 90 跳到 ~ 1000,同时使 s 小了一步,插值也变得嘈杂)并且它不够合适,如果数组长度远小于 (<50)...
其实这个数组长度取决于提供给splprep
函数的平滑因子s,但是对于不同的测量数据,s 变化很大以获得大约 90 的一致数组长度。例如对于 data1
s 具有大约 1000 的值以获得 len(cfk[0])
等于 90,对于 data2
s 的值大约为 100,在 data1
和 data2
的相同长度下,len(cfk[0])
等于 90。这可能取决于数据的噪声...
我考虑过一个循环,其中 s 在某个点开始并在循环中递减,同时不断检查 len(cfk[0])
- 但这需要很长时间,尤其是如果len(cfk[0])
接近 90。
因此,在计算 cfk 元组之前以某种方式知道平滑因子以获得所需的数组长度会很有用。
简短回答:不,不容易。 splrep 包装的 Dierckx Fortran 库使用一些相当 non-trivial 的逻辑来确定结向量,并且它全部融入 Fortran 代码中。所以,唯一的办法就是仔细追踪后者。它可以从 netlib 获得,也可以 scipy/interpolate/fitpack
是否有可能在计算值之前确定 scipy.interpolate.splprep
返回的 tck
元组中数组的数组长度?
我必须将样条插值拟合到具有 500 万个数据点(或更少,可以变化)的噪声数据。 我的观察是,数组长度为 ~ 90 的插值非常好,而计算更高数组长度的插值需要很长时间(它有时也会直接从 ~ 90 跳到 ~ 1000,同时使 s 小了一步,插值也变得嘈杂)并且它不够合适,如果数组长度远小于 (<50)...
其实这个数组长度取决于提供给splprep
函数的平滑因子s,但是对于不同的测量数据,s 变化很大以获得大约 90 的一致数组长度。例如对于 data1
s 具有大约 1000 的值以获得 len(cfk[0])
等于 90,对于 data2
s 的值大约为 100,在 data1
和 data2
的相同长度下,len(cfk[0])
等于 90。这可能取决于数据的噪声...
我考虑过一个循环,其中 s 在某个点开始并在循环中递减,同时不断检查 len(cfk[0])
- 但这需要很长时间,尤其是如果len(cfk[0])
接近 90。
因此,在计算 cfk 元组之前以某种方式知道平滑因子以获得所需的数组长度会很有用。
简短回答:不,不容易。 splrep 包装的 Dierckx Fortran 库使用一些相当 non-trivial 的逻辑来确定结向量,并且它全部融入 Fortran 代码中。所以,唯一的办法就是仔细追踪后者。它可以从 netlib 获得,也可以 scipy/interpolate/fitpack