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個服從正態分佈的數:
>>> 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中關於科學計算的工具就介紹到這裡。