1. 程式人生 > >Python教程:進擊機器學習(五)--Scipy

Python教程:進擊機器學習(五)--Scipy

Python教程:進擊機器學習(五)--Scipy

2017年08月05日 21:22:32 Whytin-Vicky 閱讀數:39876

 

 

Scipy簡介

Scipy是一個高階的科學計算庫,它和Numpy聯絡很密切,Scipy一般都是操控Numpy陣列來進行科學計算,所以可以說是基於Numpy之上了。Scipy有很多子模組可以應對不同的應用,例如插值運算,優化演算法、影象處理、數學統計等。

以下列出Scipy的子模組:

模組名 功能
scipy.cluster 向量量化
scipy.constants 數學常量
scipy.fftpack 快速傅立葉變換
scipy.integrate 積分
scipy.interpolate 插值
scipy.io 資料輸入輸出
scipy.linalg 線性代數
scipy.ndimage N維影象
scipy.odr 正交距離迴歸
scipy.optimize 優化演算法
scipy.signal 訊號處理
scipy.sparse 稀疏矩陣
scipy.spatial 空間資料結構和演算法
scipy.special 特殊數學函式
scipy.stats 統計函式

檔案輸入和輸出:scipy.io

這個模組可以載入和儲存matlab檔案:

>>> from scipy import io as spio
>>> a = np.ones((3, 3))
>>> spio.savemat('file.mat', {'a': a}) # 儲存字典到file.mat
>>> data = spio.loadmat('file.mat', struct_as_record=True)
>>> data['a']
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])

關於這個模組的文件:https://docs.scipy.org/doc/scipy/reference/io.html#module-scipy.io

線性代數操作:scipy.linalg

假如我們要計算一個方陣的行列式,我們需要呼叫det()函式:

>>> from scipy import linalg
>>> arr = np.array([[1, 2],
...                 [3, 4]])
>>> linalg.det(arr)
-2.0
>>> arr = np.array([[3, 2],
...                 [6, 4]])
>>> linalg.det(arr) 
0.0

比如求一個矩陣的轉置:

>>> arr = np.array([[1, 2],
...                 [3, 4]])
>>> iarr = linalg.inv(arr)
>>> iarr
array([[-2. ,  1. ],
       [ 1.5, -0.5]])

更多關於scipy.linalg
.

快速傅立葉變換:scipy.fftpack

首先我們用numpy初始化正弦訊號:

>>> import numpy as np
>>> time_step = 0.02
>>> period = 5.
>>> time_vec = np.arange(0, 20, time_step)
>>> sig = np.sin(2 * np.pi / period * time_vec) + \
...       0.5 * np.random.randn(time_vec.size)

如果我們要計算該訊號的取樣頻率,可以用scipy.fftpack.fftfreq()函式,計算它的快速傅立葉變換使用scipy.fftpack.fft():

>>> from scipy import fftpack
>>> sample_freq = fftpack.fftfreq(sig.size, d=time_step)
>>> sig_fft = fftpack.fft(sig)

Numpy中也有用於計算快速傅立葉變換的模組:numpy.fft
但是scipy.fftpack是我們的首選,因為應用了更多底層的工具,工作效率要高一些。關於scipy.fftpack
更多文件。

優化器:scipy.optimize

scipy.optimize通常用來最小化一個函式值,我們舉個栗子:
構建一個函式並繪製函式圖:

>>> def f(x):
...     return x**2 + 10*np.sin(x)
>>> x = np.arange(-10, 10, 0.1)
>>> plt.plot(x, f(x)) 
>>> plt.show() 

一條曲線

如果我們要找出這個函式的最小值,也就是曲線的最低點。就可以用到BFGS優化演算法(Broyden–Fletcher–Goldfarb–Shanno algorithm):

>>> optimize.fmin_bfgs(f, 0)
Optimization terminated successfully.
         Current function value: -7.945823
         Iterations: 5
         Function evaluations: 24
         Gradient evaluations: 8
array([-1.30644003])

可以得到最低點的值為-1.30644003,optimize.fmin_bfgs(f, 0)第二個引數0表示從0點的位置最小化,找到最低點(該點剛好為全域性最低點)。假如我從3點的位置開始梯度下降,那麼得到的將會是區域性最低點 3.83746663:

>>> optimize.fmin_bfgs(f, 3, disp=0)
array([ 3.83746663])

假如你無法選出the global minimum的鄰近點作為初始點的話可以使用scipy.optimize.basinhopping()
,具體就不展開描述。關於這個模組的其他功能,參考scipy.optimize

統計工具:scipy.stats

首先我們隨機生成1000個服從正態分佈的數:

image.png

>>> a = np.random.normal(size=1000)
#用stats模組計算該分佈的均值和標準差。
>>> loc, std = stats.norm.fit(a)
>>> loc     
0.0314345570...
>>> std     
0.9778613090...
#中位數
>>> np.median(a)     
0.04041769593...

這個工具還是蠻好用的,更多參考:scipy.stats

還有像scipy的其他模組(計算積分、訊號處理、影象處理的模組)就不一一介紹了。其實機器學習最基礎的部分還是屬於一些統計演算法和優化演算法。對這一部分還有興趣繼續瞭解的,戳這裡:https://docs.scipy.org/doc/scipy/reference/index.html
Python中關於科學計算的工具就介紹到這裡。

Refhttp://www.scipy-lectures.org/intro/scipy.html