Lesson 11: Data and data fitting
Lesson 11: Data and data fitting 數據與數據擬合
Example Code
- import numpy as np
- import math
- import matplotlib.pyplot as plt
- def NewSinFun(i):
- return math.sin(i) + np.random.rand(1)-0.5
- dataX = np.zeros(100)
- dataY = np.zeros(100)
- for i in range(100):
- dataX[i] = np.random.rand(1)*8
- dataY[i] = NewSinFun(dataX[i])
- z = np.polyfit(dataX[:100], dataY[:100], 1)
- p = np.poly1d(z)
- z2 = np.polyfit(dataX[:100], dataY[:100], 2)
- p2 = np.poly1d(z2)
- z3 = np.polyfit(dataX[:100], dataY[:100], 3)
- p3 = np.poly1d(z3)
- z5 = np.polyfit(dataX[:100], dataY[:100], 5)
- p5 = np.poly1d(z5)
- xp = np.linspace(0, 8, 100)
- plt.plot(dataX, dataY, marker="o", linestyle=' ',color='#0F0F0F')
- plt.plot(xp, p(xp),'g-', xp, p2(xp),'b--', xp, p5(xp),'r--' );
- plt.show()
Note and Comments
- import numpy as np: 讀入numpy函式庫並命名為np
- import math: 讀入math函式庫
- import matplotlib.pyplot as plt: 讀入matplotlib.pyplot函式庫並命名為plt
- def NewSinFun(i):
- return math.sin(i) + np.random.rand(1)-0.5: 利用def定義一個新函數NewSinFun, 此函數將回傳sine函數值並帶有正負0.5的隨機誤差
- np.zeros(n): 產生一個含有n個零數列,
- for i in range(100): 利用for迴圈產生一百個數據點,x軸爲0-8的隨機數, y軸爲我們自訂的函數值
- dataX[i] = np.random.rand(1)*8
- dataY[i] = NewSinFun(dataX[i])
- np.polyfit(x, y, n): 將以(x,y)的資料作n階多項式擬合, 此函式的回傳值爲一個一維矩陣,其數值爲不同冪次的係數. ex:[3,2,1]即爲3*x^2 + 2x + 1
- np.poly1d(z) polyld可將將此多項式矩陣視為一般函數. 所以當給予引數陣列時,函數可回傳擬合多項式的數值
- xp = np.linspace(l, m, n) 將l到m的間隔切分為n等分,並回傳數值
- plt.plot(dataX, dataY, marker="o", linestyle=' ',color='#0F0F0F')
- plt.plot(xp, p(xp),'g-', xp, p2(xp),'b--', xp, p5(xp),'r--' );
- plt.show()
result