轉載自公眾號:經管人學數據分析
公眾號作者均為電子科學技術大學信息管理專業碩士研究生團隊
Scipy是一個高級的科學計算庫,它和Numpy聯繫很密切,Scipy一般都是操控Numpy數組來進行科學計算,Scipy讓Python成為了半個MATLAB。Scipy包含的功能有最優化、線性代數、積分、插值、擬合、特殊函數、快速傅立葉變換、信號處理和圖像處理、常微分方程求解和其他科學與工程中常用的計算,而這些功能都是我們在之後進行數據分析需要的。下面是一些常用的Scipy的子模塊。
模塊名功能scipy.cluster聚類scipy.constants數學常量scipy.fftpack快速傅立葉變換scipy.integrate積分scipy.interpolate插值scipy.io數據輸入輸出scipy.linalg線性代數scipy.ndimageN維圖像scipy.odr正交距離回歸scipy.optimize優化算法scipy.signal信號處理scipy.sparse稀疏矩陣scipy.spatial空間數據結構和算法scipy.special特殊數學函數scipy.stats統計函數Scipy是依賴於numpy的,所以在安裝Scipy前需要先安裝好Numpy。安裝Scipy的方法和安裝Numpy的方法是一樣的,這裡不再提及。由於Scipy非常的完備且複雜,在日常的數據分析中,並不是每一個都會用上,本文就簡單介紹幾個常用的並且比較有趣的子模塊。
一、輸入與輸出(scipy.io)scipy.io模塊提供了多種功能來解決不同格式的文件輸入和輸出,包括Matlab,Wave,Arff,Matrix Market等等,最常見的是Matlab格式的。
import scipy.io as sio
vect = np.arange(20)
sio.savemat('sample.mat', {'vect':vect})
mat_file_content = sio.loadmat('sample.mat')
print (mat_file_content)
Scipy的optimize模塊提供了許多數值優化算法
2.1 非線性方程組求解(fsolve())求解非線性方程組
from scipy.optimize import fsolve
def f(x):
x1 = x[0]
x2 = x[1]
return [2*x1 - x2**2 - 1, x1**2 - x2 -2]
result = fsolve(f, [1,1])
print(result)
運行結果
array([ 1.91963957, 1.68501606])
from scipy.optimize import leastsq
x = np.array([8.19,2.72,6.39,8.71,4.7,2.66,3.78])
y = np.array([7.01,2.78,6.47,6.71,4.1,4.23,4.05])
def residual(p):
k,b = p
return y-(k*x+b)
r = leastsq(residual,[1,0])
k,b = r[0]
print (k,b)
運行結果
0.6134953491930442 1.794092543259387
除了上述的方程組求解和最小二乘擬合,Optimize還提供了諸如正弦波或者餘弦波的曲線擬合(curve_fit()),全局最小值(basinhopping())等等函數,基本能夠滿足我們進行優化求解的需求。
三、統計函數(scipy.stats)stats模塊提供了大約80種連續隨機變量和10多種離散分布變量,連續的和離散的隨機變量都被包含在內。所有的連續隨機變量都是rv_continuous的派生類的對象,而所有的離散隨機變量都是rv_discrete的派生類的對象。此處以最常見的正態分布為例了解一下stats的基本用法。
3.1 生成服從指定分布的隨機變量norm.rvs通過loc和scale參數可以指定隨機變量的偏移和縮放參數,這裡對應的是正態分布的期望和標準差,標準差是方差的算術平方根。size得到隨機數數組的形狀參數。(也可以使用np.random.normal(loc=0.0,scale=1.0,size=None))
from scipy import stats
stats.norm.rvs(loc = 0,scale = 1,size =10)
stats.norm.rvs(loc = 2,scale = 10,size=(3,2))
stats.norm.pdf用以求正態分布概率密度函數,stats.norm.cd用以正態分布累計概率密度函數。
sample = np.random.randn(10)
stats.norm.pdf(sample,loc = 0,scale = 1)
stats.norm.cdf(sample,loc=3,scale=1)
stats子模塊也包括了諸如kstest 和normaltest等樣本測試函數,用來檢測樣本是否服從某種分布。
sample = np.random.randn(100)
out = stats.normaltest(sample)
print (out)
out = stats.kstest(sample, 'norm')
print (out)
out = stats.kstest(sample, 'wald')
print (out)
運行結果
NormaltestResult(statistic=0.5744371686350016, pvalue=0.7503476966711264)
KstestResult(statistic=0.10850663258563678, pvalue=0.1763924285692815)
KstestResult(statistic=0.5297870596312018, pvalue=0.0)
除此之外,stats模塊中還提供了一些描述函數,如下表,這裡就不詳細講了,可以通過官網文檔進行相關學習。
函數描述describe()計算傳遞數組的幾個描述性統計信息gmean()計算沿指定軸的幾何平均值hmean()計算沿指定軸的諧波平均值kurtosis()計算峰度mode()返回模態值skew()測試數據的偏斜度f_oneway()執行單向方差分析iqr()計算沿指定軸的數據的四分位數範圍zscore()計算樣本中每個值相對於樣本均值和標準偏差的z值sem()計算輸入數組中值的標準誤差(或測量標準誤差)四、聚類scipy.cluster是一個做聚類的子模塊,它主要包含兩類聚類方法,一是矢量聚類(scipy.cluster.vq),支持vector quantization 和 k-means 聚類方法;二是層次聚類(scipy.cluster.hierarchy):支持hierarchical clustering 和 agglomerative clustering(凝聚聚類) 。這裡主要展示一下最常用的層次聚類和k-means聚類。
4.1層次聚類(scipy.cluster.hierarchy)import scipy
import scipy.cluster.hierarchy as sch
points=scipy.randn(20,4)
dis = sch.distance.pdist(points,'euclidean')
Z=sch.linkage(dis,method='average')
P=sch.dendrogram(Z)
cluster= sch.fcluster(Z, t=1)
print (cluster)
樹狀圖如下:
4.2 k-means 聚類from scipy.cluster.vq import vq,kmeans,whiten
data=whiten(scipy.randn(20,4))
centroid=kmeans(data,max(cluster))[0]
label=vq(data,centroid)[0]
print(label)
運行結果
[5 5 3 4 4 5 1 5 5 4 4 5 2 1 0 4 5 2 2 3]
有些時候我們可能不知道最終究竟聚成多少類,一個辦法是用層次聚類的結果進行初始化。當然也可以直接輸入某個數值。
通過上面的一些代碼演示,相信你一定對Scipy有了一定的了解。如果你遇到了什麼不能解決的問題,可以自行搜索獲得解答。