擬合多項式的numpy和scipy函數不包括像Matlab函數那樣自動縮放輸入的選項。
首先,這裏是你如何能滿足您的數據,而無需縮放:
In [39]: x_cord = [58.2986, 39.5842, 23.0044, 10.9427, 3.0465]
In [40]: y_cord = [0.9600, 0.9700, 0.9800, 0.9900, 1.0000]
In [41]: c = np.polyfit(x_cord, y_cord, 3)
In [42]: c
Out[42]:
array([ -1.91755884e-07, 2.43049234e-05, -1.52570960e-03,
1.00431483e+00])
In [43]: p = np.poly1d(c)
In [44]: p(16.574651718139650)
Out[44]: 0.98483061114799408
In [45]: xx = np.linspace(0, 60, 500)
In [46]: plot(xx, p(xx))
Out[46]: [<matplotlib.lines.Line2D at 0x110c8d0f0>]
In [47]: plot(x_cord, y_cord, 'o')
Out[47]: [<matplotlib.lines.Line2D at 0x10d6f8390>]
的numpy的計算agrees with Wolfram Alpha。
下面介紹如何獲得非常接近實際的Matlab計算結果。
爲了方便,將x_cord
從列表轉換爲numpy數組。
In [64]: x_cord = np.array(x_cord)
計算x_cord
的平均值和標準差。
In [65]: mu = np.mean(x_cord)
In [66]: std = np.std(x_cord, ddof=1)
呼叫np.polyfit()
,使用x_cord
的位移和縮放版本。
In [67]: cscaled = np.polyfit((x_cord - mu)/std, y_cord, 3)
這些值非常接近Matlab代碼註釋中顯示的數組p
。
In [68]: cscaled
Out[68]: array([-0.00212068, 0.00436168, -0.01410409, 0.97708027])
創建一個可調用的對象poly1d
。
In [69]: pscaled = np.poly1d(cscaled)
輸入到pscaled
必須被移動和使用mu
和std
縮放。
In [70]: pscaled((16.574651718139650 - mu)/std)
Out[70]: 0.98483061114799486
謝謝你這樣詳細的答案。這幫了我很多。 – Vants