.本節書摘來自華章出版社《機器學習系統設計:python語言實作》一書中的第2章,第2.7節,作者 [美] 戴維·朱利安(david julian),更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視
scipy對numpy增加了一層,在numpy更為純粹的數學構造之上,封裝了常用的科學和統計應用。scipy為資料的操作和可視化提供了更進階的函數,并且特别适用于互動式地使用python。scipy由覆寫了不同科學計算應用的子包組成。下面列出了與機器學習最為相關的包及其功能:

numpy和scipy包中有很多名字相同且功能類似的子產品,其中scipy中的大部分子產品都是從numpy導入的,并進行了功能擴充。然而需要注意的是,雖然scipy中有些函數的名字和numpy完全一樣,但是其功能卻稍有不同。還需要提示的是,scipy的很多類在scikit-learn包中都有便利性的封裝,有時這些封裝更容易使用。
每個包都需要顯式導入,如以下代碼所示:
我們可以從scipy的網站(scipy.org)或控制台獲得其文檔,例如,help(scipy.cluster)。
正如我們所見,優化是不同機器學習環境中的常見任務。在上一章,我們考察了單純形法的數學原理,這裡,我們使用scipy對其進行實作。我們使用單純形法對線性方程組進行了優化,問題如下:
在限制方程中,2x1 + x2≤4和x1 + 2x2≤3,求x1 + x2的最大值。
linprog可能是解決此問題最簡單的對象,它是最小化算法,是以我們需要反轉目标的符号。
首先從scipy.optimize導入linprog:
我們可以觀察到如下輸出:
這裡還有個對象是optimisation.minimize,适于解決稍微複雜一些的問題。此對象需要一個求解器作為參數,而目前有十幾個可用的求解器,如果需要更為特殊的求解器,則可以自己實作一個。最常用的,适于大多數問題的求解器是nelder-mead。這一特殊的求解器使用了下降單純形法(downhill simplex),這基本上是一種啟發式搜尋,即用所有剩餘點的質心點來替換誤差最高的測試點,并不斷疊代這一過程,直到收斂為最小。
在下面的例子中,我們使用rosenbrock函數作為測試問題。這是個非凸函數,常用來檢驗優化問題。該函數的全局極小值在一個長的抛物線波谷,是以,要在一個大的、相對平坦的波谷中找到極小值,對于算法來說是具有挑戰的。該函數示例如下:
上面代碼的輸出如下:
上例中的minimize函數有兩個強制性參數,即目标函數和初始值x0。此外還需要一個可選參數,即求解器方法,此例中我們使用nelder-mead方法。字典options是特定于求解器的一組鍵值對。這裡,xtol是對收斂可接受的相對誤差,disp用于設定消息列印。對于機器學習應用極為有用的另一個包是scipy.linalg。這個包增加了執行諸如逆矩陣、特征值計算,以及矩陣分解等任務的能力。