SciPy - Nội suy

Trong chương này, chúng ta sẽ thảo luận về cách nội suy giúp ích trong SciPy.

Nội suy là gì?

Nội suy là quá trình tìm kiếm giá trị giữa hai điểm trên một đường thẳng hoặc một đường cong. Để giúp chúng ta nhớ ý nghĩa của nó, chúng ta nên nghĩ phần đầu tiên của từ, 'inter,' có nghĩa là "enter", điều này nhắc chúng ta xem xét "bên trong" dữ liệu mà chúng ta có ban đầu. Công cụ nội suy này không chỉ hữu ích trong thống kê mà còn hữu ích trong khoa học, kinh doanh hoặc khi cần dự đoán các giá trị nằm trong hai điểm dữ liệu hiện có.

Hãy để chúng tôi tạo một số dữ liệu và xem cách nội suy này có thể được thực hiện bằng cách sử dụng scipy.interpolate gói hàng.

import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
x = np.linspace(0, 4, 12)
y = np.cos(x**2/3+4)
print x,y

Chương trình trên sẽ tạo ra kết quả sau.

(
   array([0.,  0.36363636,  0.72727273,  1.09090909,  1.45454545, 1.81818182, 
          2.18181818,  2.54545455,  2.90909091,  3.27272727,  3.63636364,  4.]),
            
   array([-0.65364362,  -0.61966189,  -0.51077021,  -0.31047698,  -0.00715476,
           0.37976236,   0.76715099,   0.99239518,   0.85886263,   0.27994201,
          -0.52586509,  -0.99582185])
)

Bây giờ, chúng ta có hai mảng. Giả sử hai mảng đó là hai kích thước của các điểm trong không gian, chúng ta hãy vẽ biểu đồ bằng chương trình sau và xem chúng trông như thế nào.

plt.plot(x, y,’o’)
plt.show()

Chương trình trên sẽ tạo ra kết quả sau.

Nội suy 1-D

Lớp interp1d trong scipy.interpolate là một phương pháp thuận tiện để tạo một hàm dựa trên các điểm dữ liệu cố định, có thể được đánh giá ở bất kỳ đâu trong miền được xác định bởi dữ liệu đã cho bằng cách sử dụng nội suy tuyến tính.

Bằng cách sử dụng dữ liệu trên, chúng ta hãy tạo một hàm nội suy và vẽ một đồ thị nội suy mới.

f1 = interp1d(x, y,kind = 'linear')

f2 = interp1d(x, y, kind = 'cubic')

Sử dụng hàm interp1d, chúng tôi tạo ra hai hàm f1 và f2. Các hàm này, đối với một đầu vào cho trước x trả về y. Loại biến thứ ba đại diện cho loại kỹ thuật nội suy. 'Tuyến tính', 'Gần nhất', 'Không', 'Tuyến tính', 'Bậc hai', 'Lập thể' là một vài kỹ thuật nội suy.

Bây giờ, chúng ta hãy tạo một đầu vào mới có độ dài hơn để thấy sự khác biệt rõ ràng của phép nội suy. Chúng tôi sẽ sử dụng cùng một chức năng của dữ liệu cũ trên dữ liệu mới.

xnew = np.linspace(0, 4,30)

plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--')

plt.legend(['data', 'linear', 'cubic','nearest'], loc = 'best')

plt.show()

Chương trình trên sẽ tạo ra kết quả sau.

Splines

Để vẽ các đường cong mượt mà qua các điểm dữ liệu, các nhà soạn thảo đã từng sử dụng các dải gỗ, cao su cứng, kim loại hoặc nhựa dẻo mỏng được gọi là các đường cong cơ học. Để sử dụng spline cơ học, các chốt được đặt tại một lựa chọn hợp lý của các điểm dọc theo một đường cong trong một thiết kế, và sau đó spline được uốn để nó chạm vào từng chốt này.

Rõ ràng, với cấu trúc này, spline nội suy đường cong tại các chốt này. Nó có thể được sử dụng để tái tạo đường cong trong các bản vẽ khác. Các điểm đặt các chốt được gọi là các nút thắt. Chúng ta có thể thay đổi hình dạng của đường cong được xác định bởi spline bằng cách điều chỉnh vị trí của các nút thắt.

Spline đơn biến

Đường spline làm mịn một chiều phù hợp với một tập hợp các điểm dữ liệu nhất định. Lớp UnivariateSpline trong scipy.interpolate là một phương pháp thuận tiện để tạo một hàm, dựa trên lớp điểm dữ liệu cố định - scipy.interpolate.UnivariateSpline (x, y, w = None, bbox = [None, None], k = 3, s = Không, ext = 0, check_finite = False).

Parameters - Sau đây là các tham số của Spline đơn biến.

  • Điều này phù hợp với spline y = spl (x) của độ k với dữ liệu x, y đã cho.

  • 'w' - Chỉ định trọng lượng để lắp spline. Phải tích cực. Nếu không có (mặc định), các trọng số đều bằng nhau.

  • 's' - Chỉ định số lượng nút thắt bằng cách chỉ định điều kiện làm mịn.

  • 'k' - Độ nhẵn của spline. Phải <= 5. Mặc định là k = 3, một spline khối.

  • Ext - Điều khiển chế độ ngoại suy cho các phần tử không nằm trong khoảng được xác định bởi trình tự nút.

    • nếu ext = 0 hoặc 'ngoại suy', trả về giá trị ngoại suy.

    • nếu ext = 1 hoặc 'không', trả về 0

    • nếu ext = 2 hoặc 'tăng', tăng một ValueError

    • nếu ext = 3 của 'const', trả về giá trị biên.

  • check_finite - Kiểm tra xem các mảng đầu vào chỉ chứa các số hữu hạn hay không.

Chúng ta hãy xem xét ví dụ sau.

import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline
x = np.linspace(-3, 3, 50)
y = np.exp(-x**2) + 0.1 * np.random.randn(50)
plt.plot(x, y, 'ro', ms = 5)
plt.show()

Sử dụng giá trị mặc định cho tham số làm mịn.

spl = UnivariateSpline(x, y)
xs = np.linspace(-3, 3, 1000)
plt.plot(xs, spl(xs), 'g', lw = 3)
plt.show()

Thay đổi mức độ làm mịn theo cách thủ công.

spl.set_smoothing_factor(0.5)
plt.plot(xs, spl(xs), 'b', lw = 3)
plt.show()