1. 程式人生 > >python 最小二乘 leastsq 函數實現

python 最小二乘 leastsq 函數實現

誤差 實現 是個 ipy plt 筆記 matplot otl code

代碼修改自 http://www.cnblogs.com/NanShan2016/p/5493429.html

網上百度了一下,主要是兩個例子,一個利用了多項式函數,一個就是這個。有些細節沒看懂,主要是忽略了p是個參數的數組而非一個數(Python基礎問題),糾結完加上註釋做個筆記

  1. # 修改自 http://www.cnblogs.com/NanShan2016/p/5493429.html
  2. ### 最小二乘法 python leastsq###
  3. import numpy as np
  4. from scipy.optimize import leastsq
  5. ###采樣點(Xi,Yi)###
  6. Xi=np.array([8.19
    ,2.72,6.39,8.71,4.7,2.66,3.78])
  7. Yi=np.array([7.01,2.78,6.47,6.71,4.1,4.23,4.05])
  8. # p是個數組,表示所有參數!!!
  9. ### 定義誤差函數,擬合y=kx+b,p[0]表示k,p[1]表示b
  10. def error(p,x,y):
  11. return (p[0]*x+p[1])-y #x、y都是列表,故返回值也是個列表
  12. ###主函數從此開始###
  13. # 可能是使用梯度下降法而非矩陣運算,因此需要給定初始參數p0
  14. p0=[2,2]
  15. Para=leastsq(error,p0,args=(Xi,Yi)) #把error函數中除了p以外的參數打包到args中
  16. k = Para[0][0]
  17. b = Para[0][1]
  18. print("k=",k,‘\n‘,"b=",b)
  19. ###繪圖,看擬合效果###
  20. import matplotlib.pyplot as plt
  21. plt.scatter(Xi,Yi,color="red",label="Sample Point",linewidth=3) #畫樣本點
  22. x=np.linspace(0,10,100)
  23. y=k*x+b
  24. plt.plot(x,y,color="orange",label="Fitting Line",linewidth=2) #畫擬合直線
  25. plt.legend()
  26. plt.show()


From WizNote

python 最小二乘 leastsq 函數實現