python 均方误差_一个很随意的Python智能优化库,一个文件就是一个库-- PySwarm
之前無聊做了個簡單的Python智能算法庫的小總結:Python智能優化算法庫小匯總 。當時沒注意到有一個庫PySwarms是基于另外一個小庫 PySwarm開發的。
這個庫非常有意思,整個庫只依賴Numpy,并且最核心的文件其實只有一個:pso.py.
簡介里面寫著:pso that supports constraints. 并且還有200個stars.
這么有趣的庫我們當然要來玩一玩。于是開干:
先來個最簡單的無約束優化
目標函數就取一個最簡單的二次函數:
簡單跑一下看看效果。這個問題很顯然解析解就是所有變量為0,它的結果是10的負5次方量級,基本上算是對的。誤差我們用的是默認值,迭代次數也不多,還行。
再來試試它標榜的帶約束優化
這個問題整得稍復雜一點,它的最優值是 x1等于6,x2等于4.9999,目標函數的最小值是11。(注意,這里說的就是精確值)。
跑完之后看看效果。幾乎和解析解一樣,誤差很小。這個效果還是挺不錯的。
針對這個問題我們還要簡單解釋一下,它的約束條件的定義其實非常簡單。寫成標準函數就是 g(x)大于等于0。在咱們這個例子里由于它是一個線性函數,所以我們就直接列出它的系數矩陣。這種定義方式非常方便,因為只要是 可計算 的函數都可以寫出來。
上面這些問題都還比較簡單,但在實際問題中我們更想玩的一類問題是,帶有參數的優化問題。
比如我們先考慮一下這個非常簡單的問題。目標函數仍然是一個二次函數,但每個分量的前面都有個系數。
這個語法也很簡單,先定義一個帶有兩個參數的函數。再把參數值寫成一個dict放在外面,最后把它傳給pso函數即可。運行之后我們可以看到這個效果還是不錯的,也是在10的負5次方量級。
這種帶參數的優化算法就忍不住讓人玩一把函數擬合
咱們來考慮這個非常簡單的線性函數。目標函數設成均方誤差。那么這里 xi, yi 組成的樣本集就是我們要傳的參數。
為了方便起見我們先讓 x 在1到10取值,取100個點。為了讓難度增大一點我們在生成 y的時候加上5%的噪聲。最后把它們放到一個dict里面。
為了更方便,我們改變一下目標函數的定義,直接用**kwargs作為參數,這樣我們就可以省略掉在函數中重新對變量進行提取命名的過程。 直接調用x,y就可以了。返回值就是最小均方誤差。
尋優范圍我們設成負5到正5。一切就緒開干看結果。 注意咱們生成數據時的模型里a等于0.1,b等于2。由PSO算出的結果分別是0.1043和1.9734。由于加了5%的噪聲,出現了一點偏差,這是非常正常的。而最后的均方誤差也只有0.531。效果還是很不錯的。
為了更直觀地看到效果咱還是把對比圖畫一下。由于我們給的系數比較小,所以加了5%的噪聲過后還是能看到很明顯的波動。不過擬合出的這條直線看起來是很好地穿過了它們的中間,效果是不錯的。如果噪聲再小一點可能還會更好。
當然,這個庫似乎也并不完美
目前感覺毛病還挺多,比如不能在API關閉verbose,沒有返回迭代過程(收斂曲線的值)等等。但整個設計很完整,運行也很穩定。所以還是可以玩一玩的。
另外,目前我們仍然覺得Python的智能算法庫還不夠多,不夠豐富。希望今后能有更多更好的庫出現吧。
今天就到這里,謝謝大家!~
關注我們分享更多有趣有用的知識喲~
總結
以上是生活随笔為你收集整理的python 均方误差_一个很随意的Python智能优化库,一个文件就是一个库-- PySwarm的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python增删改查的框架layui_s
- 下一篇: linux解压mysql文件命令行_li