breeze源码阅读心得
生活随笔
收集整理的這篇文章主要介紹了
breeze源码阅读心得
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在閱讀Spark ML源碼的過程中,發現很多機器學習中的優化問題,都是直接調用breeze庫解決的,因此拿來breeze源碼想一探究竟。整體來看,breeze是一個用scala實現的基礎數學庫,breeze之于Spark ML,就像numpy和scipy之于sklearn一樣,很多Spark ML中的優化問題,看到后面發現都是在breeze庫中解決的,對于有志于理解底層實現的朋友來說,breeze是一本很好的教科書。 雖然breeze僅2.5MB代碼,比Spark ML僅多了40%,但閱讀的難度大不少,因為breeze相對更偏底層,用到了很多scala語言的核心特征,尤其是scala的類型系統和隱式轉換,如果這兩部分功底不足閱讀上會有很大障礙,這里推薦一本書,Scala in Depth,都說中文版翻譯的很差,我也沒讀過,還是直接看英文版吧,講的很清楚。 啰啰嗦嗦一大堆,現在就領著大家走馬觀花的逛一逛breeze這個庫,筆者也是工作之余在看,接觸沒多久,還請高手指教。 閱讀的起點最好是generic文件夾,其中包含了breeze中最底層的UFunc特征,這是用來表達breeze中操作、函數等一系列內容的基礎類,它主要是提供了一大堆模板,用來產生具體的操作和函數,代碼晦澀難懂,如果實在看不懂可以跳過,知道這是一個關于操作和函數的底層基礎類就好了。另外還包含了Multimethod.scala,這個特征用來提供一些注冊器,產生一個方法時,我們可以先在這里注冊,當我們需要用到一個方法的時候,它可以利用動態反射原理,在已注冊方法中挑選出合適的方法返回。具體應用我也沒搞清。 接下來就可以進入math庫看看了,這里面包含了很多基礎數學的結構,需要一定的集合論知識。首先,是Semiring, Ring, Field,分別代表半環、環、域,分別定義了各自的基礎結構,其中,大多數實際定義都在Field中,因為域是三者中要求最高、也最具體的集合類型,而Semiring和Ring中的內容,都是從Field中遷移過去的。然后是Complex.scala,定義了復數,以及相關的很多操作,LogDouble.scala,定義了對數表示的各種運算,MatrixNorms.scala,定義了各類矩陣Norm的計算方法,PowImplicits.scala,利用隱式轉換,為各類基礎方法加入了pow方法(隱式轉換的典型應用:擴展以后類,為以后類添加方法),最后是VectorSpace.scala,顧名思義定義了線性空間相關的操作,這里面的trait關系太復雜,關系圖畫了半天放棄了,有時間再來理理清楚。 然后可以進入linalg庫,這是breeze最大的一個庫,但結構相對來說非常清晰,根目錄下定義了線性代數常用的數據結構,比如Vector, Matrix, DenseMatrix, CSCMatrix等等,還有一些線性代數里的基本操作,比如LSMR包含了一種通過迭代求最小二乘問題的算法,pca包含了PCA算法等,這里的類都非常基礎,代碼相對來說也比較難懂。但子目錄下的代碼就相對好很多了,support包含了一系列的trait,這些trait大多以Can開頭,顧名思義就是表示某個類是否具有某種能力,比如CanCopy表示是否能夠被拷貝,CanSlice表示是否能夠被索引等等。function文件夾下包含了各種函數功能,比如Max,Accumulate,Argmax等等。operators文件夾中包含了一般性的操作定義,比如BinaryOp, CounterOp等等,代碼也較為晦澀。 再看看stats庫,這里面最重要的就是distribution文件夾,里面包含了各種基礎的分布的表示方法,分布的表示分為離散型和連續型,這個庫可以作為一個數學中概率論和數理統計、隨機過程的學習教材,基本原理都來自概率數學,而且代碼結構非常清晰,對于理解各類機器學習算法也非常重要,推薦仔細閱讀。stats庫中其余的內容都比較直接,就不一一介紹了。 終于進入了我們最關心的optimize庫,這是一個通用的優化庫,包含了線性優化、Proximal優化、流優化、凸優化等等。也是非常好的優化教程,正在學習最優化的朋友如果對實現感興趣可以仔細閱讀這一塊的代碼,非常受用。當然,對于機器學習算法來說,最重要的還是LBFGS和OWLQN,這兩個分別是求解一般線性模型中的二次最優化問題時最常用的算法,LBFGS用于求解L2正則化的問題,OWLQN是LBFGS算法的變種,用于求解L1正則化問題。這里比較重要的是DiffFunction和Minimizer,分別代表了損失和最小優化器,也是breeze的optimize重要的兩個對外接口,在Spark ML庫中就經常見到這倆函數。前者返回損失和梯度信息,后者統籌優化算法迭代,有興趣可以看下這兩個類以及它們的子類。 以上我們介紹的generic, math, linalg, stats, optimize都是breeze中的基礎庫,另外的庫屬于附加庫,下面我們一句話介紹下它們的內容,對特定領域感興趣的朋友可以深入閱讀源碼。 collection包含了breeze中常用的集合類型,也可以算是基礎庫,它包含了可變和不可變集合兩個內容。features包含了一個特征向量的定義。integrate包含了積分相關的內容。interpolation包含了插值計算相關的內容。io包含了輸入輸出內容,比如讀寫csv文件。numeric包含了數值計算相關的內容,其中包含了CODATA2010定義的一些常數。polynomial包含了多項式相關的計算、signal包含了信號處理相關的計算,比如各種濾波函數。storage包含了存儲相關的庫。util包含了一些應用功能。 以上就簡單的走馬觀花式介紹了breeze,歡迎感興趣的朋友一起探討。我最近也在持續閱讀,有更細節的體會也會及時發出來跟大家交流。
轉載于:https://www.cnblogs.com/jicanghai/p/8686531.html
總結
以上是生活随笔為你收集整理的breeze源码阅读心得的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fcode-页面九宫格自动锁屏jquer
- 下一篇: 构建之法4、17章观后感