SciPy - 插值



在本章中,我們將討論插值如何在 SciPy 中發揮作用。

什麼是插值?

插值是線上或曲線上的兩點之間查詢值的程式。為了幫助我們記住它的含義,我們應該考慮單詞的第一部分“inter”,表示“進入”,這提醒我們檢視我們最初擁有的資料的“內部”。這種工具,插值,不僅在統計學中很有用,而且在科學、商業或需要預測落在兩個現有資料點之間的值時也很有用。

讓我們建立一些資料,看看如何使用scipy.interpolate包進行此插值。

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

上述程式將生成以下輸出。

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

現在,我們有兩個陣列。假設這兩個陣列是空間中點的兩個維度,讓我們使用以下程式進行繪圖,看看它們是什麼樣子。

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

上述程式將生成以下輸出。

Interpolation

一維插值

scipy.interpolate中的interp1d類是一種方便的方法,可以根據固定資料點建立函式,該函式可以使用線性插值在給定資料定義的域內的任何位置進行評估。

使用上述資料,讓我們建立一個插值函式並繪製一個新的插值圖。

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

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

使用interp1d函式,我們建立了兩個函式f1和f2。這些函式對於給定的輸入x返回y。第三個變數kind表示插值技術的型別。“線性”、“最近”、“零”、“Slinear”、“二次”、“三次”是幾種插值技術。

現在,讓我們建立一個新的更長的輸入來檢視插值的明顯差異。我們將在新資料上使用舊資料的相同函式。

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

上述程式將生成以下輸出。

1-D Interpolation

樣條曲線

為了在資料點之間繪製平滑曲線,繪圖員曾經使用稱為機械樣條的薄而靈活的木條、硬橡膠、金屬或塑膠條。要使用機械樣條,將銷釘放置在設計中曲線上的明智選擇的點上,然後彎曲樣條,使其接觸到每個銷釘。

顯然,透過這種構造,樣條曲線在這​​些銷釘處對曲線進行插值。它可用於在其他圖紙中複製曲線。放置銷釘的點稱為節點。我們可以透過調整節點的位置來改變樣條曲線定義的形狀。

單變數樣條曲線

一維平滑樣條曲線擬合給定的資料集。scipy.interpolate中的UnivariateSpline類是一種方便的方法,可以根據固定資料點建立函式類 - scipy.interpolate.UnivariateSpline(x, y, w = None, bbox = [None, None], k = 3, s = None, ext = 0, check_finite = False)。

引數 - 以下是單變數樣條曲線的引數。

  • 這將對提供的x、y資料擬合一個度數為k的樣條曲線y = spl(x)。

  • “w” - 指定樣條擬合的權重。必須為正。如果為None(預設值),則所有權重都相等。

  • “s” - 透過指定平滑條件來指定節點的數量。

  • “k” - 平滑樣條的次數。必須<= 5。預設為k = 3,三次樣條曲線。

  • Ext - 控制不在節點序列定義的區間內的元素的插值模式。

    • 如果ext = 0或“extrapolate”,則返回外推值。

    • 如果ext = 1或“zero”,則返回0

    • 如果ext = 2或“raise”,則引發ValueError

    • 如果ext = 3或“const”,則返回邊界值。

  • check_finite – 是否檢查輸入陣列是否僅包含有限數字。

讓我們考慮以下示例。

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

使用平滑引數的預設值。

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

手動更改平滑量。

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

© . All rights reserved.