??Scipy是一個用于數(shù)學、科學、工程領域的常用軟件包,可以處理插值、積分、優(yōu)化、圖像處理、常微分方程數(shù)值解的求解、信號處理等問題。它用于有效計算Numpy矩陣,使Numpy和Scipy協(xié)同工作,高效解決問題。
??Scipy是由針對特定任務的子模塊組成:
模塊名 | 應用領域 |
---|---|
scipy.cluster | 向量計算/Kmeans |
scipy.constants | 物理和數(shù)學常量 |
scipy.fftpack | 傅立葉變換 |
scipy.integrate | 積分程序 |
scipy.interpolate | 插值 |
scipy.io | 數(shù)據(jù)輸入輸出 |
scipy.linalg | 線性代數(shù)程序 |
scipy.ndimage | n維圖像包 |
scipy.odr | 正交距離回歸 |
scipy.optimize | 優(yōu)化 |
scipy.signal | 信號處理 |
scipy.sparse | 稀疏矩陣 |
scipy.spatial | 空間數(shù)據(jù)結構和算法 |
scipy.special | 一些特殊的數(shù)學函數(shù) |
scipy.stats | 統(tǒng)計 |
載入和保存matlab文件
from scipy import io as spiofrom numpy as npx = np.ones((3,3))spio.savemat('f.mat',{'a':a})data = spio.loadmat('f.mat',struct_as_record=True)data['a']
讀取圖片
from scipy import miscmisc.imread('picture')
??special庫中的特殊函數(shù)都是超越函數(shù),所謂超越函數(shù)是指變量之間的關系不能用有限次加、減、乘、除、乘方、開方 運算表示的函數(shù)。如初等函數(shù)中的三角函數(shù)、反三角函數(shù)與對數(shù)函數(shù)、指數(shù)函數(shù)都是初等超越函數(shù),一般來說非初等函數(shù)都是超越函數(shù)。
初等函數(shù):指由基本初等函數(shù)經過有限次四則運算與復合運算所得到的函數(shù)
??下面我們對scipy.special中的部分常用函數(shù)進行說明:
貝塞爾函數(shù)
??在介紹貝塞爾函數(shù)之前,先對貝塞爾方程進行說明,一般來說,我們將形如
其中
在圓柱形波導中的電磁波傳播問題
圓柱體中的熱傳導問題
圓形或環(huán)形薄膜的震動膜態(tài)分析問題
信號處理中的調頻合成(FMsynthesis)
波動聲學
??在scipy.special中使用scipy.special.jn()計算
橢圓函數(shù)
??橢圓函數(shù)是定義在有限復平面上亞純的雙周期函數(shù)。所謂的雙周期是指具有兩個基本周期的單復變函數(shù),即存在
Erf(高斯曲線的面積)
??高斯曲線是指高斯分布也就是我們常說的正態(tài)分布
當
scipy.linalg.det():計算方陣的行列式
scipy.linalg.inv():計算方陣的逆
scipy.linalg.svd():奇異值分解
??快速傅立葉變換(FFT),是快速計算序列的離散傅立葉變換(DFT)或其逆變換的方法。FFT會通過把DFT矩陣分解為稀疏因子之積來快速計算此類變換。
scipy.fftpack使用:
scipy.fftpack.fftfreq():生成樣本序列
scipy.fftpack.fft():計算快速傅立葉變換
??scipy.optimize模塊提供了函數(shù)最值、曲線擬合和求根的算法。
函數(shù)最值
??以尋找函數(shù)
from scipy import optimizeimport numpy as npimport matplotlib.pyplot as plt#定義目標函數(shù)def f(x): return x**2+10*np.sin(x)#繪制目標函數(shù)的圖形plt.figure(figsize=(10,5))x = np.arange(-10,10,0.1)plt.xlabel('x')plt.ylabel('y')plt.title('optimize')plt.plot(x,f(x),'r-',label='$f(x)=x^2+10sin(x)$')#圖像中的最低點函數(shù)值a = f(-1.3)plt.annotate('min',xy=(-1.3,a),xytext=(3,40),arrowprops=dict(facecolor='black',shrink=0.05))plt.legend()plt.show()
圖形輸出如下:
顯然這是一個非凸優(yōu)化問題,對于這類函數(shù)得最小值問題一般是從給定的初始值開始進行一個梯度下降,在optimize中一般使用bfgs算法。
optimize.fmin_bfgs(f,0)
結果顯示在經過五次迭代之后找到了一個局部最低點-7.945823,顯然這并不是函數(shù)的全局最小值,只是該函數(shù)的一個局部最小值,這也是擬牛頓算法(BFGS)的局限性,如果一個函數(shù)有多個局部最小值,擬牛頓算法可能找到這些局部最小值而不是全局最小值,這取決與初始點的選取。在我們不知道全局最低點,并且使用一些臨近點作為初始點,那將需要花費大量的時間來獲得全局最優(yōu)。此時可以采用暴力搜尋算法,它會評估范圍網格內的每一個點。對于本例,如下:
grid = (-10, 10, 0.1)xmin_global = optimize.brute(f, (grid,))print(xmin_global)
搜尋結果如下:
可以使用scipy.optimize.fminbound(function,a,b)得到指定范圍([a,b])內的局部最低點。
函數(shù)零點
scipy.optimize.fsolve(f,x):函數(shù)可以求解f=0的零點,x是根據(jù)函數(shù)圖形特征預先估計的一個零點。
曲線擬合
scipy.optimize.curve_fit():非線性最小二乘擬合
from scipy import optimizexdata = np.linspace(-10, 10, num=20)ydata = f(xdata) + np.random.randn(xdata.size)def f2(x, a, b): return a*x**2 + b*np.sin(x)guess = [2, 2]params, params_covariance = optimize.curve_fit(f2, xdata, ydata, guess)print(params)
scipy.optimize.leatsq():最小二乘法擬合
'''使用最小二乘法擬合直線'''import numpy as npfrom scipy.optimize import leastsqimport matplotlib.pyplot as plt#訓練數(shù)據(jù)Xi = np.array([8.19,2.72,6.39,8.71,4.7,2.66,3.78])Yi = np.array([7.01,2.78,6.47,6.71,4.1,4.23,4.05])#定義擬合函數(shù)形式def func(p,x): k,b = p return k*x+b#定義誤差函數(shù)def error(p,x,y,s): print(s) return func(p,x)-y#隨機給出參數(shù)的初始值p = [10,2]#使用leastsq()函數(shù)進行參數(shù)估計s = '參數(shù)估計次數(shù)'Para = leastsq(error,p,args=(Xi,Yi,s))k,b = Para[0]print('k=',k,'\n','b=',b)#圖形可視化plt.figure(figsize = (8,6))#繪制訓練數(shù)據(jù)的散點圖plt.scatter(Xi,Yi,color='r',label='Sample Point',linewidths = 3)plt.xlabel('x')plt.ylabel('y')x = np.linspace(0,10,1000)y = k*x+bplt.plot(x,y,color= 'orange',label = 'Fitting Line',linewidth = 2)plt.legend()plt.show()
擬合效果如下:
'''使用最小二乘法擬合正弦函數(shù)'''import numpy as npfrom scipy.optimize import leastsqimport matplotlib.pyplot as plt #定義擬合函數(shù)圖形def func(x,p): A,k,theta = p return A*np.sin(2*np.pi*k*x+theta)#定義誤差函數(shù)def error(p,x,y): return y-func(x,p)#生成訓練數(shù)據(jù)#隨機給出參數(shù)的初始值p0 = [10,0.34,np.pi/6]A,k,theta = p0x = np.linspace(0,2*np.pi,1000)#隨機指定參數(shù)y0 = func(x,[A,k,theta])#randn(m)從標準正態(tài)分布中返回m個值,在本例作為噪聲y1 = y0 + 2*np.random.randn(len(x))#進行參數(shù)估計Para = leastsq(error,p0,args=(x,y1))A,k,theta = Para[0]print('A=',A,'k=',k,'theta=',theta)'''圖形可視化'''plt.figure(figsize=(20,8))ax1 = plt.subplot(2,1,1)ax2 = plt.subplot(2,1,2)#在ax1區(qū)域繪圖plt.sca(ax1)#繪制散點圖plt.scatter(x,y1,color='red',label='Sample Point',linewidth = 3)plt.xlabel('x')plt.xlabel('y')y = func(x,p0)plt.plot(x,y0,color='black',label='sine',linewidth=2)#在ax2區(qū)域繪圖plt.sca(ax2)e = y-y1plt.plot(x,e,color='orange',label='error',linewidth=1)#顯示圖例和圖形plt.legend()plt.show()