2013-07-28 2 views
12

У меня есть экспериментальные данные, к которым я пытаюсь подобрать кривую, используя функцию UnivariateSpline в scipy. Данные выглядит следующим образом:Установка данных с использованием UnivariateSpline в scipy python

x   y 
13 2.404070 
12 1.588134 
11 1.760112 
10 1.771360 
09 1.860087 
08 1.955789 
07 1.910408 
06 1.655911 
05 1.778952 
04 2.624719 
03 1.698099 
02 3.022607 
01 3.303135  

Вот что я делаю:

import matplotlib.pyplot as plt 
from scipy import interpolate 
yinterp = interpolate.UnivariateSpline(x, y, s = 5e8)(x) 
plt.plot(x, y, 'bo', label = 'Original') 
plt.plot(x, yinterp, 'r', label = 'Interpolated') 
plt.show() 

Вот как это выглядит:

Curve fit

мне было интересно, если кто-то думал, что на другой кривой варианты крепления, которые могут иметь scipy? Я относительно новичок в scipy.

Спасибо!

+0

У вас есть априорное знание о данных, которые вы работаете? Может быть теоретическое представление? Или вы можете получить больше данных? 50 или 100 баллов? – twil

+0

@twil: Нет. Данные взяты из эксперимента с участием человеческих решений. Это все, что я знаю. Я пытаюсь подогнать кривую с целью экстраполяции на дальнейшие значения х. Я пробовал кубический сплайн и полифит, но они тоже не хороши. Я что-то не так с выбором функции сглаживания выше в UnivariateSpline? –

+0

У вас все в порядке, но у вас мало данных. Я бы сказал, что значения в 3 и 13 несколько не «нормальные». Если вы удалите их, вы получите ... лучшую кривую? Но без каких-либо знаний или предположений о процессе это несправедливо :) – twil

ответ

31

Есть несколько вопросов.

Первый номер - это порядок значений x. Из документации scipy.interpolate.UnivariateSpline мы находим

x : (N,) array_like 
    1-D array of independent input data. MUST BE INCREASING. 

стресса добавляемого мной. Для данных, которые вы указали, x находится в обратном порядке. Чтобы отладить это, полезно использовать «нормальный» сплайн, чтобы убедиться, что все имеет смысл.

Вторая проблема, а также еще одна актуальная для вашей проблемы, относится к параметру s. Что оно делает? Опять же из документации мы находим

s : float or None, optional 
    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 

    If None (default), s=len(w) which should be a good value if 1/w[i] is 
    an estimate of the standard deviation of y[i]. If 0, spline will 
    interpolate through all data points. 

Так s определяет, насколько близко интерполированное кривая должна прийти к точкам данных, в смысле метода наименьших квадратов. Если мы установим значение очень большое, то сплайн не должен приближаться к точкам данных.

В качестве законченного примера рассмотрим следующую

import scipy.interpolate as inter 
import numpy as np 
import pylab as plt 

x = np.array([13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]) 
y = np.array([2.404070, 1.588134, 1.760112, 1.771360, 1.860087, 
      1.955789, 1.910408, 1.655911, 1.778952, 2.624719, 
      1.698099, 3.022607, 3.303135]) 
xx = np.arange(1,13.01,0.1) 
s1 = inter.InterpolatedUnivariateSpline (x, y) 
s1rev = inter.InterpolatedUnivariateSpline (x[::-1], y[::-1]) 
# Use a smallish value for s 
s2 = inter.UnivariateSpline (x[::-1], y[::-1], s=0.1) 
s2crazy = inter.UnivariateSpline (x[::-1], y[::-1], s=5e8) 
plt.plot (x, y, 'bo', label='Data') 
plt.plot (xx, s1(xx), 'k-', label='Spline, wrong order') 
plt.plot (xx, s1rev(xx), 'k--', label='Spline, correct order') 
plt.plot (xx, s2(xx), 'r-', label='Spline, fit') 
# Uncomment to get the poor fit. 
#plt.plot (xx, s2crazy(xx), 'r--', label='Spline, fit, s=5e8') 
plt.minorticks_on() 
plt.legend() 
plt.xlabel('x') 
plt.ylabel('y') 
plt.show() 

Result from example code

+0

Спасибо, что объяснили смысл сглаживания параметра s и указали неправильный порядок. Он отлично работает! –

+0

Если я налагаю условие, что сплайн должен монотонно уменьшаться, делает ли UnivariateSpline это? Благодаря! –

+0

@PrakharMehrotra Я не понимаю вопроса. Для реализации сплайна требуется, чтобы x увеличивалось. Как это сделано в примере, просто обратное преобразование массивов, когда они находятся в противоположном порядке. –

Смежные вопросы