科學計算庫之Scipy

2021-02-20 大鄧和他的Python

轉載自公眾號:經管人學數據分析
公眾號作者均為電子科學技術大學信息管理專業碩士研究生團隊

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)

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])

2.2最小二乘擬合(leastsq())

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))

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) 

3.3 統計檢驗

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有了一定的了解。如果你遇到了什麼不能解決的問題,可以自行搜索獲得解答。

相關焦點

  • 科學計算庫Scipy簡易入門
    0.導語Scipy是一個用於數學、科學、工程領域的常用軟體包,可以處理插值、積分、優化、圖像處理、常微分方程數值解的求解、信號處理等問題。它用於有效計算Numpy矩陣,使Numpy和Scipy協同工作,高效解決問題。
  • AI 基礎:Scipy(科學計算庫) 簡易入門
    0.導語Scipy是一個用於數學、科學、工程領域的常用軟體包,可以處理插值、積分、優化、圖像處理、常微分方程數值解的求解、信號處理等問題。它用於有效計算Numpy矩陣,使Numpy和Scipy協同工作,高效解決問題。
  • 【Python基礎】科學計算庫Scipy簡易入門
    0.導語Scipy是一個用於數學、科學、工程領域的常用軟體包,可以處理插值、積分、優化、圖像處理、常微分方程數值解的求解、信號處理等問題。它用於有效計算Numpy矩陣,使Numpy和Scipy協同工作,高效解決問題。
  • 【Nature Methods 】SciPy 1.0:Python科學計算的基本算法
    儘管Fortran已有很長的歷史,但它仍然是一種高性能的科學程式語言。我們經常使用Cython作為C/C++編寫的成熟的低級科學計算庫與SciPy提供的Python接口之間的粘合劑。我們還使用Cython在Python代碼中實現性能增強,特別是對於大量使用的內部循環受益於具有靜態類型的編譯代碼的情況。    為了實現新功能,Python仍然是首選的語言。
  • 高級的科學計算庫——Scipy
    4.1簡介4.2統計假設與檢驗 stats包4.3信號特徵4.4尋優4.5求解4.6曲線擬合 curve-fit4.7插值4.8模式聚類Scipy是一個高級的科學計算庫,它和Numpy聯繫很密切,Scipy一般都是操控Numpy
  • 科學計算庫 SciPy 的前世今生
    本文分享自機器之心公眾號,作者:機器之心編輯部每年千萬下載量,科學計算開源庫 SciPy,你已經是個成熟的小夥伴了。作為科學計算中的中流砥柱,SciPy 從 2001 年到現在已經走過了十九個年頭,它為最優化、積分、微分方程等各種數值計算提供了完整的流程,也為科研分析人員提供了最好用與高效的開源庫。
  • 科學計算工具包SciPy簡介
    SciPy是一個基於Python的用於數學、科學和工程的開源軟體生態系統,而SciPy模塊則是這個生態系統的核心包之一。SciPy庫依賴於NumPy,提供了便捷且快速的多維數組操作,以及許多易用和高效的算法,如數值積分、插值、優化、線性代數和統計等。
  • Python數據分析常見庫介紹之Scipy
    Scipy是一個高級的科學計算庫,它和Numpy聯繫很密切,Scipy一般都是操控Numpy數組來進行科學計算,Scipy讓Python成為了半個
  • 初識Scipy
    Scipy常用函數示例1、科學計算常量Demo:from scipy import constants as C#圓周率print(C.pi)#黃金比例print(C.golden)#真空中的光速print(C.c)#普朗克常數print
  • 【學習心得087】python學習-科學計算Scipy包功能一覽(上)
    SciPy是一個開源的Python算法庫和數學工具包,主要用於科學計算,可有效地計算nupmpy矩陣。 SciPy包含的模塊有最優化、線性代數、積分、插值、特殊函數、快速傅立葉變換、信號處理和圖像處理、常微分方程求解和其他科學與工程中常用的計算。本文僅給出幾個例子給出使用Scipy進行計算的大致思想,重點討論積分,優化,線性代數,統計。
  • 走過19年,每年千萬下載量,科學計算開源庫SciPy的前世今生
    機器之心報導機器之心編輯部每年千萬下載量,科學計算開源庫 SciPy,你已經是個成熟的小夥伴了。並藉助 SciPy 1.0 這個成熟的象徵,展現了當前科學計算以及未來發展方向都是什麼樣的。論文地址:https://www.nature.com/articles/s41592-019-0686-2SciPy 項目地址:https://github.com/scipy/scipy
  • [公開課]《Python:從計算到算計》第04講: 科學計算(Scipy)
    scipy.io: 數據輸入輸出scipy.integrate: 積分scipy.interpolate: 插值scipy.linalg: 線性代數scipy.optimize: 優化scipy.cluster: 聚類scipy.constants: 物理和數學常量scipy.fftpack
  • 線性規劃python手冊03:使用Scipy包解LP
    Scipy是一個用於數學、科學、工程領域的常用軟體包,可以處理插值、積分、優化、圖像處理、常微分方程數值解的求解、信號處理等問題。
  • Scipy使用簡介
    特徵值和特徵向量連續概率分布離散概率分布核密度函數二項分布,泊松分布,伽馬分布二項分布泊松分布伽馬分布學生分布(t-分布)和t檢驗卡方分布和卡方檢驗數值積分常數和特殊函數物理常量from scipyfunc返回將x代入方程組之後得到的每個方程的誤差,x0為未知數的一組初始解from math import sin,cosfrom scipy import optimizedef f(x):    x0,x1,x2=x.tolist()    return [        5*x1+3,
  • 第3格 | 用scipy.optimize進行參數擬合
    https://docs.scipy.org/doc/scipy/reference/optimize.html  scipy.optimize.minimize fmin: 只有  Nelder-Mead simplex algorithm
  • scipy 常見統計檢驗與概率分布
    from scipy.stats import binomimport matplotlib.pyplot as pltn = 100p = 0.1x = range(21)y = binom.pmf(x, n, p)plt.plot(x,y)plt.title
  • 【收藏】萬字解析Scipy的使用技巧!
    特徵值和特徵向量連續概率分布離散概率分布核密度函數二項分布,泊松分布,伽馬分布二項分布泊松分布伽馬分布學生分布(t-分布)和t檢驗卡方分布和卡方檢驗數值積分常數和特殊函數物理常量from scipyfunc返回將x代入方程組之後得到的每個方程的誤差,x0為未知數的一組初始解from math import sin,cosfrom scipy import optimizedef f(x):    x0,x1,x2=x.tolist()    return [        5*x1+3,
  • 如何系統地學習Python 中 matplotlib, numpy, scipy, pandas?
    Matplotlib,Numpy,SciPy 和 Pandas 這幾個庫在我們使用 Python 從事數據科學工作時都不可或缺,不過它們的用途並不相同