У меня проблемы с получением scipy.interpolate.UnivariateSpline для использования любого сглаживания при интерполяции. Основываясь на странице функции , а также на некоторых предыдущих постах , я считаю, что она должна обеспечивать сглаживание с параметром 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()
Вот результат:
Я пробовал это с диапазоном значений s
(0,01, 0,1, 1, 2, 5, 50), а также с явными весами, установленными на одно и то же (1,0) или случайным образом. Я все еще не могу получить сглаживание, и количество узлов всегда совпадает с количеством точек данных. В частности, я ищу сглаживающие выбросы, подобные этой 4-й точке (7990.4664106277542, 5851.6866463790966).
Это потому, что мне не хватает данных? Если да, то можно ли использовать подобную функцию сплайна или кластерную технику, чтобы добиться сглаживания с этими несколькими точками данных?