天天看點

Scipy 學習 第1篇:插補

scipy包提供了幾種通用的插補工具,分别用于1維,2維或高維的資料集,分别是:

類 interp1d 

用于對一維資料進行插補

類 ​​griddata​​ 提供了對1D,2D和高維資料進行插補的工具。

spline插補, 用于對一維和二維資料進行平滑的cubic-spline 插補

使用基于徑向的函數(RBF)進行插值

這些方法都內建在scipy.interpolate子產品中。

一維插補類(interp1d),是一種基于一維固定資料點建立函數的便捷方法,該函數内推一個一進制的函數f,使得 y=f(x):

kind 參數用于指定内推的類型,(‘linear’, ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘previous’, ‘next’和 ‘nearest’。對于'linear',是預設值,表示線性插補,前面已描述;對于 ‘zero’, ‘slinear’, ‘quadratic’ 和 ‘cubic’ 引用的是spline内推,使用 zeroth, first, second 和 third 順序。對于 ‘previous’ 、 ‘next’ 和  ‘nearest’ 簡單傳回資料點的前一個、後一個或最近的一個資料。 

舉個例子,使用interp1d内推兩個函數,并繪制兩個函數插補的資料點:

Scipy 學習 第1篇:插補

對于多元的資料,次元之間是互相關聯的,例如,age、education和income是互相關聯的,可以認為income = f(age,education)。對于二維資料,使用griddata 内推一個二進制函數,z=f(x,y)。

參數注釋:

points:自變量,對于二進制函數而言,points是指由(x,y)構成的資料點

values:因變量,values是指某一個資料點的值,對于二進制函數而言,資料點(x,y)的值是z=f(x,y)

xi:坐标系,或者說是資料點在坐标系中的位置,也可以把points的值作為坐标系的x和y軸,把values作為坐标系的z軸

method:有效值是‘linear’, ‘nearest’, ‘cubic’

一維spline的處理過程分為兩個基本步驟:計算曲線的spline表示,對目标點進行評估。scipy有兩種方式來計算曲線的spline表示和平滑系數:直接方式和參數化方式。

1,直接方式

直接方式使用splrep()函數從2維平面中查找曲線的spline表示,x和y是曲線在二維坐标系中的坐标。

splrep()函數的作用是對于給定資料點集(x [i],y [i]),确定在間隔xb <= x <= xe上平滑度為k的近似值。

x和y定義一個曲線,y=f(x)

w 權重,用于在spline拟合時計算權重最小二乘法的值,w的預設值為1/(len(x))。如果y值中的誤差是向量d給出的标準偏差,則w應為1 / d。

xb,xe:用于拟合的間隔,如果沒有指定,那麼預設值分别是x[0] 和 x[-1]。

k  用于指定spline order,預設值是3,字元串表示為cubic,k的取值區間是[1,5]

s 用于制定平滑條件,滿足以下條件來确定平滑度:sum((w *(y-g))** 2,axis = 0)<= s,其中g(x)是(x,y)的平滑插值。 使用者可以使用s來控制貼合度和平滑度之間的權衡,較大的s表示更平滑,而較小的s值表示較不平滑。s的推薦值取決于權重w。 如果權重代表y的标準偏差的倒數,則應在(m-sqrt(2 * m),m + sqrt(2 * m))範圍内找到一個好的s值,其中m是 x,y和w中的資料點。 預設值:如果提供了權重,則s = m-sqrt(2 * m)。 如果未提供權重,則s = 0.0(内插)。

該函數輸出的結果是一個三元組tck,這個三元組就是曲線的spline表示,用于表示曲線的節點向量、系數和spline序号,預設的spline orde是cubic,這可以通過k參數來修改。一旦确定了曲線的spline表示,就可以使用splev()函數對x進行評估:

舉個例子,使用splrep()函數來擷取曲線的spline表示,也就是tck,再通過tck和splev()函數來評估曲線:

Scipy 學習 第1篇:插補

2,參數化方式

對于在N維空間中的區間,使用函數splprep()來定義曲線的參數:

x:代表N維空間中曲線的N個數組的清單,每個數組的長度都是曲線的點的數量,每一個數組都提供N維資料點的一個分量。

u:是參數值的數組,該參數預設為0到1之間的等距單調序列,計算公式是:

M = len(x[0]), where v[0] = 0 v[i] = v[i-1] + distance(x[i], x[i-1]) u[i] = v[i] / v[M-1]

ub,ue:參數間隔的端點,預設值是 u [0]和u [-1]。

k:spline拟合的度,推薦使用預設值k=3,表示cubic,k的取值區間是[1,5]

s:平滑度,是0到1之間的小數,0表示不平滑,值越大,平滑度越高。

per:如果非0,那麼把資料點視為周期性曲線,周期為x [m-1]-x [0],并傳回平滑的周期樣條近似。

預設輸出包含兩個對象:第一個對象是一個三元祖(t,c,k),分别表示曲線的節點向量、系數和spline序号;第二個對象是一個參數變量u。

對于函數splprep() 傳回的spline表示,使用splev()函數來評估

Scipy 學習 第1篇:插補