2013-07-28 25 views
12

Tôi có dữ liệu thử nghiệm mà tôi đang cố gắng vừa với đường cong bằng hàm UnivariateSpline trong scipy. Các dữ liệu trông giống như:Dữ liệu phù hợp bằng cách sử dụng UnivariateSpline trong python scipy

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  

Đây là những gì tôi đang làm:

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() 

Đó là cách nó trông giống:

Curve fit

tôi đã tự hỏi nếu có ai đã nghĩ về đường cong khác tùy chọn phù hợp mà scipy có thể có? Tôi tương đối mới để scipy.

Cảm ơn!

+0

Bạn có kiến ​​thức apriori về dữ liệu bạn đang làm việc với ai? Có thể là đại diện lý thuyết? Hoặc bạn có thể nhận được nhiều dữ liệu hơn không? 50 hoặc 100 điểm? – twil

+0

@twil: Không. Dữ liệu từ thí nghiệm liên quan đến các quyết định của con người. Đó là tất cả những gì tôi biết. Tôi đang cố gắng để phù hợp với một đường cong với mục đích ngoại suy để giá trị hơn nữa của x. Tôi đã thử spline khối và polyfit, nhưng họ cũng không tốt. Tôi có làm gì sai với lựa chọn chức năng làm mịn ở trên trong UnivariateSpline không? –

+0

Bạn đang làm ok nhưng phải có ít dữ liệu. Tôi muốn nói các giá trị ở mức 3 và 13 có phần không "bình thường". Nếu bạn loại bỏ chúng, bạn sẽ nhận được một ... đường cong tốt hơn? Nhưng không có bất kỳ kiến ​​thức hoặc giả định về quá trình đó là không công bằng :) – twil

Trả lời

31

Có một số vấn đề.

Vấn đề đầu tiên là thứ tự của giá trị x. Từ tài liệu cho scipy.interpolate.UnivariateSpline, chúng tôi tìm thấy

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

Căng thẳng do tôi thêm vào. Đối với dữ liệu bạn đã cho x là theo thứ tự đảo ngược. Để gỡ lỗi này, việc sử dụng spline "bình thường" để đảm bảo mọi thứ có ý nghĩa.

Vấn đề thứ hai và vấn đề thứ hai liên quan trực tiếp đến vấn đề của bạn, liên quan đến tham số s. Nó làm gì? Một lần nữa từ tài liệu chúng tôi tìm thấy

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. 

Vì vậy, s xác định khoảng cách giữa đường cong nội suy phải đến điểm dữ liệu, theo nghĩa tối thiểu. Nếu chúng ta đặt giá trị rất lớn thì spline không cần đến gần các điểm dữ liệu.

Là một ví dụ hoàn chỉnh cân nhắc những điều sau

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

Cảm ơn bạn đã giải thích ý nghĩa của làm mịn tham số s, và để trỏ thứ tự không chính xác. Nó hoạt động tốt! –

+0

Nếu tôi áp đặt điều kiện mà spline cần giảm đơn điệu, UnivariateSpline có cho phép tôi thực hiện điều đó không? Cảm ơn! –

+0

@PrakharMehrotra Tôi không hiểu câu hỏi. Việc thực hiện spline yêu cầu x tăng lên. Như đã làm trong ví dụ này, đơn giản là đảo ngược mảng khi chúng trái ngược với thứ tự bắt buộc. –

Các vấn đề liên quan