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

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
@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? –
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