scipy splrep () с весами, не соответствующими заданной кривой

Используя scipy splrep I легко вписывается в тестовую синусоиду:

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 что значение по умолчанию для параметра веса 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. Gist с тестовой записной книжкой IPython


person Uli Köhler    schedule 07.02.2016    source источник


Ответы (1)


Вам нужно изменить только одну строку вашего кода, чтобы получить идентичный результат:

tck = splrep(x, y, w=np.ones(len(x_spl)))

должен стать

tck = splrep(x, y, w=np.ones(len(x_spl)), s=0)

Итак, единственная разница в том, что вы должны указать s вместо использования по умолчанию.

Если вы посмотрите на исходный код из splrep вы увидите, почему это необходимо:

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) соответственно).

person Cleb    schedule 08.02.2016