大師兄的Python機器學習筆記:Numpy庫、Scipy庫和Matplotlib庫(二)

大師兄的Python機器學習筆記:Numpy庫、Scipy庫和Matplotlib庫(一)
大師兄的Python機器學習筆記:Numpy庫、Scipy庫和Matplotlib庫 (三)

三、Scipy庫

1. Scipy庫的功能
  • 主要用于數學、科學和工程計算。
  • 依賴Numpy庫和Numpy數組,與Numpy協作高效解決問題。
  • 可以處理插值、積分、優化、圖像處理、常微分方程數值解的求解、信號處理等問題。
2. scipy.constants模塊
  • scipy.constants模塊包含的是科學領域的常量。
2.1 數學常量

1)pi

  • π
>>>from scipy.constants import pi
>>>print(pi)
3.141592653589793

2)golden

  • 黃金比例。
>>>from scipy.constants import golden
>>>print(golden)
1.618033988749895
2.2 物理常數

1)c / speed_of_light

  • 真空光速。
>>>from scipy.constants import c
>>>print(c)
299792458.0

>>>from scipy.constants import speed_of_light
>>>print(speed_of_light)
299792458.0

2)h / Planck

  • 普朗克常數
>>>from scipy.constants import h
>>>print(h)
6.62607004e-34

>>>from scipy.constants import Planck
>>>print(Planck)
6.62607004e-34

3)G

  • 引力
>>>from scipy.constants import G
>>>print(G)
6.67408e-11

4)e

  • 電荷
>>>from scipy.constants import e
>>>print(e)
1.6021766208e-19

5)R

  • 摩爾氣體常數
>>>from scipy.constants import R
>>>print(R)
8.3144598

6)Avogadro

  • 阿芙伽羅常數
>>>from scipy.constants import Avogadro
>>>print(Avogadro)
6.022140857e+23

7)k

  • 玻耳茲曼常量
>>>from scipy.constants import k
>>>print(k)
1.38064852e-23

8)electron_mass / m_e

  • 電子質量
>>>from scipy.constants import electron_mass
>>>print(electron_mass)
9.10938356e-31

>>>from scipy.constants import m_e
>>>print(m_e)
9.10938356e-31

9)proton_mass / m_p

  • 質子質量
>>>from scipy.constants import proton_mass
>>>print(proton_mass)
1.672621898e-27

>>>from scipy.constants import m_p
>>>print(m_p)
1.672621898e-27

10)neutron_mass / m_n

  • 中子質量
>>>from scipy.constants import neutron_mass
>>>print(neutron_mass)
1.674927471e-27

>>>from scipy.constants import m_n
>>>print(m_n)
1.674927471e-27
2.3 常用單位
單位
milli 0.001
micro 1e-06
kilo 1000

以及更多單位。

>>>from scipy.constants import milli,micro,kilo
>>>print("milli:",milli)
milli: 0.001
>>>print("micro:",micro)
micro: 1e-06
>>>print("kilo:",kilo)
kilo: 1000.0
2.4 更多常量
常量
gram 1克
atomic_mass 原子質量常數
degree 1弧度
minute 60秒
day 一天幾秒
inch 一英寸表示為多少米
micron 一微米表示為多少米
light_year 一光年表示為多少米
atm 帕斯卡為單位表示的標準大氣壓
acre 一英畝表示為多少平方米
liter 一升以立方米為單位表示
gallon 一加侖以立方米為單位表示
kmh 千米每小以米每秒為單位表示
degree_Fahrenheit 凱爾文氏以華氏度表示
eV 1電子伏以焦耳表示
hp 馬力以瓦特表示
dyn 達因以牛頓表示
>>>from scipy.constants import *
>>>constants = ["gram","atomic_mass","degree","minute","day","inch","micron","light_year","atm","acre","liter","gallon","kmh","degree_Fahrenheit","eV","hp","dyn","lambda2nu"]
>>>for x in constants:
>>>    print("{title}:{value}".format(title=x,value=eval(x)))
gram:0.001
atomic_mass:1.66053904e-27
degree:0.017453292519943295
minute:60.0
day:86400.0
inch:0.0254
micron:1e-06
light_year:9460730472580800.0
atm:101325.0
acre:4046.8564223999992
liter:0.001
gallon:0.0037854117839999997
kmh:0.2777777777777778
degree_Fahrenheit:0.5555555555555556
eV:1.6021766208e-19
hp:745.6998715822701
dyn:1e-05
2.4 find(<name="">)
  • 用于通過名稱查找常量
>>>from scipy.constants import find
>>>find("kilo")
['atomic mass unit-kilogram relationship',
'electron volt-kilogram relationship',
'hartree-kilogram relationship',
'hertz-kilogram relationship',
'inverse meter-kilogram relationship',
'joule-kilogram relationship',
'kelvin-kilogram relationship',
'kilogram-atomic mass unit relationship',
'kilogram-electron volt relationship',
'kilogram-hartree relationship',
'kilogram-hertz relationship',
'kilogram-inverse meter relationship',
'kilogram-joule relationship',
'kilogram-kelvin relationship']
3. scipy.special模塊
  • scipy.special模塊包含了一些雜項函數。
  • 由于函數量太大,僅列出部分函數,完整版請參考官方文檔

1)cbrt(<N>)

  • <N>盡量使用N數組。
  • 返回數組每個元素的立方根。
>>>import numpy as np
>>>from scipy.special import cbrt
>>>n = np.arange(1,20)
>>>res = cbrt(n)
>>>print(res)
[1.         1.25992105 1.44224957 1.58740105 1.70997595 1.81712059
1.91293118 2.         2.08008382 2.15443469 2.22398009 2.28942849
2.35133469 2.41014226 2.46621207 2.5198421  2.57128159 2.62074139
2.66840165]

2)exp10(<N>)

  • 返回數組每個元素的指數函數。
>>>import numpy as np
>>>from scipy.special import exp10
>>>n = np.arange(1,20)
>>>res = exp10(n)
>>>print(res)
[1.e+01 1.e+02 1.e+03 1.e+04 1.e+05 1.e+06 1.e+07 1.e+08 1.e+09 1.e+10
1.e+11 1.e+12 1.e+13 1.e+14 1.e+15 1.e+16 1.e+17 1.e+18 1.e+19]

3)sindg(<N>)

  • 返回數組每個元素(角度)的正弦函數。
>>>import numpy as np
>>>from scipy.special import sindg
>>>n = np.array([0,30,60,90])
>>>res = sindg(n)
>>>print(res)
[0.        0.5       0.8660254 1.       ]

4)round(<N>)

  • 返回數組每個元素的四舍五入值。
>>>import numpy as np
>>>from scipy.special import round
>>>n = np.array([1.23,100.01,-23.12,3.1415])
>>>res = round(n)
>>>print(res)
[  1. 100. -23.   3.]

5)comb(<N>,<k>)

  • 返回以數組中每個元素作為個數,從個數中選擇<k>個隨機數的組合數。
>>>import numpy as np
>>>from scipy.special import comb
>>>n = np.arange(1,20)
>>>res = comb(n,2)
>>>print(res)
[  0.   1.   3.   6.  10.  15.  21.  28.  36.  45.  55.  66.  78.  91.
105. 120. 136. 153. 171.]

6)perm(<N>,<k>)

  • 返回以數組中每個元素作為個數,從個數中選擇<k>個隨機數的排列數。
>>>import numpy as np
>>>from scipy.special import perm
>>>n = np.arange(1,20)
>>>res = perm(n,2)
>>>print(res)
[  0.   2.   6.  12.  20.  30.  42.  56.  72.  90. 110. 132. 156. 182.
210. 240. 272. 306. 342.]

7)gamma(<N>)

  • 返回數組每個元素的gamma分布值。
>>>import numpy as np
>>>from scipy.special import gamma
>>>n = np.arange(1,20)
>>>res = gamma(n)
>>>print(res)
[1.00000000e+00 1.00000000e+00 2.00000000e+00 6.00000000e+00
2.40000000e+01 1.20000000e+02 7.20000000e+02 5.04000000e+03
4.03200000e+04 3.62880000e+05 3.62880000e+06 3.99168000e+07
4.79001600e+08 6.22702080e+09 8.71782912e+10 1.30767437e+12
2.09227899e+13 3.55687428e+14 6.40237371e+15]

8)beta(<a>,<b>)

  • 返回數組<a>,<b>每個元素對應的beta分布值。
  • beta(<a>,<b>) = gamma(<a>) * gamma(<b>) / gamma(<a> +<b>)
>>>import numpy as np
>>>from scipy.special import beta
>>>n1 = np.arange(0.1,1)
>>>n2 = np.arange(1,10)
>>>res = beta(n1,n2)
>>>print(res)
[10.          9.09090909  8.65800866  8.37871806  8.17435908  8.01407753
 7.88269921  7.77167528  7.67572867]
4. scipy.K-Means模塊
  • 包含聚類工具,將相似的數據歸類到同一類別。
  • 引用位置:Scipy.cluster.vq
  • 準備數據:
>>>import numpy as np
>>>from numpy.random import rand
>>>data = np.stack(((rand(1,10)+np.arange(0.01,0.1)),rand(1,10)))
>>>print(data)
[[[0.52725988 0.49689366 0.75202077 0.17472057 0.20556629 0.11345316
   0.10091491 0.63352045 0.70583981 0.91223879]]

 [[0.26358852 0.6033158  0.09409396 0.40834894 0.89472134 0.32503465
   0.92269377 0.40634446 0.44611134 0.10560189]]]

1)whiten(<data>)

  • 白化數據,是一種常見的數據預處理方法,用于去除樣本數據的冗余信息。
>>>from scipy.cluster.vq import whiten
>>>whiten(data)
array([[[ 3.99937168,  9.33816373,  2.28603171,  1.49571367,
         0.59657485,  1.07242991,  0.24560113,  5.57735393,
         5.43521317,  2.26183253]],

      [[ 1.99937168, 11.33816373,  0.28603171,  3.49571367,
         2.59657485,  3.07242991,  2.24560113,  3.57735393,
         3.43521317,  0.26183253]]])

2)kmeans(<data>,<k>)

  • 將數據分成k個聚類,并計算聚類的中心點。
>>>from scipy.cluster.vq import kmeans
>>>centroids,_=kmeans(data,2)
>>>print(centroids)
[[1.01341581 0.93636675 1.01109258]
[0.51448817 0.50702164 0.50066985]]
>>>print(_)
0.4501383917858607

3)vq(<data>,<centroids>)

  • 根據中心點<centroids>返回聚類和元素到中心點的距離。
>>>from scipy.cluster.vq import vq
>>>clx,dist = vq(data,centroids)
>>>print(clx)
[0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
5. fftpack模塊
  • 包含傅里葉變換的算法工具。

1)fft(<data>)

  • 實現快速傅里葉變換。
>>>import numpy as np
>>>from scipy.fftpack import fft
>>># 采樣點數
>>>N = 2000

>>># 才樣品路
>>>Fs = 4000

>>>n = np.array([np.cos(0),np.cos(np.pi/2),np.cos(np.pi),np.cos(np.pi*2)])
>>>yf = fft(n)
>>>
>>># 振幅
>>>abs_yf = np.abs(yf)

>>># 相位
>>>angle_y = np.angle(yf)
>>>print('傅里葉變換:',yf)
>>>print('直流信號')
>>>print('振幅:',abs_yf[0]/N)
>>>print('相位:',angle_y)
傅里葉變換: [ 1.+0.j  2.+1.j -1.+0.j  2.-1.j]
直流信號
振幅: 0.0005
相位: [ 0.          0.46364761  3.14159265 -0.46364761]

2)ifft(<data>)

  • 實現快速傅里葉逆變換。
  • 與fft()互逆。
>>>import numpy as np
>>>from scipy.fftpack import ifft
>>>n = np.array([ 1.+0.j,  2.+1.j, -1.+0.j,  2.-1.j])
>>>ifft(n)
array([ 1.+0.j,  0.+0.j, -1.+0.j,  1.+0.j])

3)dct(<data>)

  • 返回離線余弦變換。
  • 離散余弦變換(DCT)是對實信號定義的一種變換,變換后在頻域中得到的也是一個實信號,相比離散傅里葉變換DFT而言, DCT可以減少一半以上的計算。
>>>import numpy as np
>>>from scipy.fftpack import dct
>>>n = np.array([np.cos(0),np.cos(np.pi/2),np.cos(np.pi),np.cos(np.pi*2)])
>>>dct(n)
array([ 2.        ,  0.76536686,  4.24264069, -1.84775907])

4)idct(<data>)

  • 返回離散余弦逆變換。
>>>import numpy as np
>>>from scipy.fftpack import dct
>>>n = np.array([np.cos(0),np.cos(np.pi/2),np.cos(np.pi),np.cos(np.pi*2)])
>>>idct(n)
array([ 0.3511533 ,  0.5664545 ,  4.26197263, -1.17958043])
6. integrate模塊
  • 提供積分相關的方法。

1)quad(<f>,<a>,<b>,<args=None>)

  • 求函數f(x)的一重積分。
  • <a>,<b>分別是函數的上限和下限,<args>是函數的系數參數。
  • \int^b_af(x)dx
  • 返回兩個值,分別是積分值和積分值的絕對誤差值
>>>from scipy.integrate import quad
>>>import numpy as np
>>>f = lambda x:np.exp(x**2)
>>>res = quad(f,-5,5)
>>>print("積分值:{}".format(res[0]),"絕對誤差值:{}".format(res[1]))
積分值:14708307495.674295 絕對誤差值:0.8040450761960138

2)dblquad(<f>,<a>,<b>,<gfun>,<hfun>)

  • 求函數f(x,y)的二重積分。
  • <a>,<b>分別是x函數的上限和下限。
  • <gfun>,<hfun>分別是y函數的上限和下限函數。
  • \int^b_a\int^h_gf(x,y)dxdy
>>>from scipy.integrate import dblquad
>>>import numpy as np
>>>import math
>>>f = lambda x,y:x*y
>>>g = lambda x:0
>>>h = lambda y:math.sqrt(y**2)
>>>res = dblquad(f,-5,5,g,h)
>>>print(res)
(0.0, 1.7347526424764603e-12)

3) tplquad()和nquad()

  • 1)、2)相似,分別用于計算三重積分和多重積分。
7. interpolate模塊
  • interpolate模塊可以根據一系列點生成擬合函數,即插值。

1)interp1d(<x>,<y>,<kind>)

  • 根據一系列的點(x,y),生成擬合函數。
  • <kind>表示插值方式,包含以下類型:
類型 含義
neareat 最鄰近插值法
zero 階梯插值
slinear、linear 線性插值
quadratic、cubic 2、3階B樣條曲線插值
>>>from scipy import interpolate
>>>import numpy as np
>>>import matplotlib.pyplot as plt

>>># 生成一系列點
>>>x = np.linspace(0,5,10)
>>>y = np.sin(x)

>>># 生成擬合函數
>>>f = interpolate.interp1d(x,y,kind="linear") 
>>>x1 = np.linspace(0,5,30)

>>># 輸出結果
>>>plt.plot(x,y,'o',x1,f(x1),'-')
>>>plt.legend(['data','linear'],loc='best')
>>>plt.show()


2)UnivariateSpline(<x>,<y>,<s=0>)

  • 對含有噪聲的數值進行插值運算。
  • s表示平滑參數。
>>>from scipy import interpolate
>>>import numpy as np
>>>import matplotlib.pyplot as plt

>>># 生成一系列帶噪聲點
>>>x = np.linspace(0,5,10)
>>>y = np.sin(x)+ 0.1*np.random.randn(10) # 通過隨機值增加噪聲
>>>plt.plot(x,y,'ro',ms=5)

>>># 生成函數
>>>sp = interpolate.UnivariateSpline(x,y,s=5)
>>>x1 = np.linspace(0,5,1000)
>>>plt.plot(x1,sp(x1),'g',lw=3)
>>>plt.legend(['data','linear'],loc='best')
>>>plt.show()
8. linalg模塊
  • 包含線性代數的相關工具。
  • scipy.linalg模塊包含numpy.linalg模塊中的全部功能,還有一些numpy.linalg中沒有的高級功能。

1)slove(<a>,<b>)

  • 用于解線性方程。
  • <a>數組表示系數數組,<b>數組表示等號右側值。
  • 返回值是一個數組。
>>>from scipy import linalg
>>>import numpy as np

>>>"""
>>>解方程組:
>>>    2x+3y+4z = 20
>>>    x+6y+7z = 14
>>>    5x+y+10z = 30
>>>"""

>>># 獲得數組
>>>a = np.array([[2,3,4],[1,6,7],[5,1,10]])
>>>b = np.array([20,14,30])

>>># 求解
>>>res = linalg.solve(a,b)
>>>print(res)
[ 9.32307692  3.07692308 -1.96923077]

2)det(<A>)

  • 接受一個矩陣,返回矩陣的行列式值。
>>>from scipy import linalg
>>>import numpy as np
>>>a = np.array([[2,3,4],[1,6,7],[5,1,10]])
>>>res = linalg.det(a)
>>>print(res)
65.0

3)eig(<A>)

  • 接受一個矩陣,返回矩陣的特征值與特征向量。
>>>from scipy import linalg
>>>import numpy as np
>>>a = np.array([[2,3,4],[1,6,7],[5,1,10]])
>>>l,v = linalg.eig(a)
>>>print('特征值:{}'.format(l))
>>>print('特征向量:{}'.format(v))
特征值:[13.86697005+0.j          2.06651498+0.64568824j  2.06651498-0.64568824j]
特征向量:[[-0.38576969+0.j         -0.56961344+0.19858249j -0.56961344-0.19858249j]
[-0.64017262+0.j         -0.65347247+0.j         -0.65347247-0.j        ]
[-0.66434988+0.j          0.4485768 -0.088646j    0.4485768 +0.088646j  ]]

4)svd(<A>)

  • 接受一個矩陣,將矩陣轉置并返回奇異值。
  • 返回三個值:
含義
U 左奇異向量(A的轉置矩陣,MxM)
\sum 奇異值(一個MxN的矩陣,除了對角線的元素外,其它都是0)
V^T 右奇異向量(A的轉置矩陣,NxN)
>>>from scipy import linalg
>>>import numpy as np
>>>a = np.array([[2,3,4],[1,6,7],[5,1,10]])
>>>U,s,Vh = linalg.svd(a)
>>>print("原矩陣:{}\n".format(a))
>>>print("U:{}\n".format(U))
>>>print("s:{}\n".format(s))
>>>print("Vh:{}\n".format(Vh))
原矩陣:[[ 2  3  4]
[ 1  6  7]
[ 5  1 10]]

U:[[-0.35562115 -0.19756122 -0.91351144]
[-0.58360352 -0.71649964  0.38214551]
[-0.73002776  0.66902752  0.13950501]]

s:[14.71637294  4.85816804  0.90915941]

Vh:[[-0.33601925 -0.360042   -0.87032225]
[ 0.45974439 -0.86918649  0.18207126]
[-0.82202564 -0.33894632  0.45759068]]
9. optimize模塊
  • 包含常用數值優化的算法。

1)fmin_bfgs(<f>,<x0>)

  • 標量函數極值求解。
  • <f>是求值的函數,<x0>是梯度下降的初始值。
  • 返回函數最小值的x值,如果有局部最小值,會返回局部最小值。
>>>from scipy.optimize import fmin_bfgs
>>>import numpy as np
>>>import matplotlib.pyplot as plt

'''
求函數: f(x) = x^2 + 2x + 1的極小值
'''

>>># 函數
>>>def f(x):
>>>    return (x**2 + 2*x + 1)

>>>x = np.arange(-5,5,0.1)

>>># 畫出曲線
>>>plt.plot(x,f(x))

>>># 返回極小值
>>>x_cord = fmin_bfgs(f,0)
>>>x_min = x_cord[0]
>>>y_min = f(x_min)

>>># 畫出點
>>>plt.scatter(x_min,y_min,s=20,c='b')
>>>plt.show()
Optimization terminated successfully.
        Current function value: 0.000000
        Iterations: 2
        Function evaluations: 9
        Gradient evaluations: 3


2)basinhopping(<f>,<x0>)

  • 標量函數極值求解。
  • 返回函數全局最小值的x值。
  • 比fmin_bfgs()消耗更多資源,但不會返回局部最小值。
>>>from scipy.optimize import basinhopping
>>>import numpy as np
>>>import matplotlib.pyplot as plt

'''
求函數: f(x) = x**2 + 10*cos(x)的極小值
'''

>>># 函數
>>>def f(x):
>>>    return (x**2 + 10*np.cos(x))

>>>x = np.arange(-5,5,0.1)

>>># 畫出曲線
>>>plt.plot(x,f(x))

>>># 返回極小值
>>>x_cord = basinhopping(f,0)

>>>print(x_cord)
>>>x_min = x_cord.x[0]
>>>y_min = f(x_min)

>>># 畫出點
>>>plt.scatter(x_min,y_min,s=20,c='b')
>>>plt.show()
                       fun: -1.8089833418214676
lowest_optimization_result:       fun: -1.8089833418214676
hess_inv: array([[0.09479589]])
     jac: array([1.78813934e-07])
 message: 'Optimization terminated successfully.'
    nfev: 18
     nit: 4
    njev: 6
  status: 0
 success: True
       x: array([2.59573908])
                   message: ['requested number of basinhopping iterations completed successfully']
     minimization_failures: 0
                      nfev: 1650
                       nit: 100
                      njev: 550
                         x: array([2.59573908])


3)brute(<f>,<x0>)

  • 函數蠻力法,與basinhopping()類似,但效率極低。
>>>from scipy.optimize import brute
>>>import numpy as np
>>>import matplotlib.pyplot as plt

'''
求函數: f(x) = x**2 + 10*cos(x)的極小值
'''

>>># 函數
>>>def f(x):
>>>    return (x**2 + 10*np.cos(x))

>>>x = np.arange(-5,5,0.1)

>>># 畫出曲線
>>>plt.plot(x,f(x))

>>># 返回極小值
>>>r = slice(-np.pi/2, np.pi/2, np.pi/200)
>>>x_cord = brute(f,(r,))

>>>print(x_cord)
>>>x_min = x_cord[0]
>>>y_min = f(x_min)

>>># 畫出點
>>>plt.scatter(x_min,y_min,s=20,c='b')
>>>plt.show()
[-2.59572559]


4)fminbound(<f>,<x1>,<x2>)

  • 取一定范圍內的函數最小值。
  • <x1>和<x2>是范圍邊界。
>>>from scipy.optimize import fminbound
>>>import numpy as np
>>>import matplotlib.pyplot as plt

'''
求函數: f(x) = x**2 + 10*cos(x)在π/2和3π/4之間的極小值
'''

>>># 函數
>>>def f(x):
>>>    return (x**2 + 10*np.cos(x))

>>>x = np.arange(-5,5,0.1)

>>># 畫出曲線
>>>plt.plot(x,f(x))

>>># 返回極小值

>>>x_min = fminbound(f,np.pi/2,3/4*np.pi)
>>>y_min = f(x_min)

>>># 畫出點
>>>plt.scatter(x_min,y_min,s=20,c='b')
>>>plt.show()


5)fsolve(<f>,<x0>)

  • 函數求解,返回函數的根值。
>>>from scipy.optimize import fsolve
>>>import numpy as np

'''
求一元函數函數: f(x) = x**2 + 10*cos(x)的解
'''

>>># 函數
>>>def f(x):
>>>    return (x**2 + 10*np.cos(x))

>>>res = fsolve(f,1)
>>>print(res)
[1.96887294]

'''
求解方程組:
f1(x+2y) = 0
f2(y-4)= 0
'''
>>>def f(x):
>>>    return [
>>>        x[0]+2*x[1],
>>>        x[1]-4
>>>    ]

>>>res = fsolve(f,[1,1])
>>>print(res)
[-8.  4.]

6)curve_fit(<f>,<x1>,<y1>)

  • 為函數<f>創建擬合曲線。
  • <x1>,<y1>為樣本數組
  • 返回曲線的系數和協方差。
>>>from scipy.optimize import curve_fit
>>>import numpy as np
>>>import matplotlib.pyplot as plt
'''
根據函數生成數據: f(x) = x**2 + 10*cos(x)
'''
>>># 函數
>>>def f(x, a, b):
>>>   return a*np.sin(x) + b

>>># 制作樣本數據
>>>x_data = np.linspace(-10,10,10)
>>>y_data = f(x_data, 10, 1) + np.random.randn(x_data.size)# 加入噪聲

>>># 生成曲線
>>>variables,variables_covariance = curve_fit(f,x_data,y_data)

>>>print("系數:{}".format(variables))
>>>print("協方差:{}".format(variables_covariance))
系數:[10.48927209  0.77088139]
協方差:[[ 8.79371473e-02 -9.99394876e-11]
[-9.99394876e-11  4.52348670e-02]]

7)leastsq(<f>,<x0>,<args=()>)

  • 用最小二乘擬合法獲得最符合函數<f>的曲線。
  • <x0>表示初始參數值。
  • <args>表示函數的其他參數。
>>>from scipy.optimize import leastsq
>>>import numpy as np
>>>import matplotlib.pyplot as plt

>>># 創建數據
>>>a = np.arange(0,100,5)
>>>b = np.array([0,5,14,24,34,36,41,43,47,53,56,61,63,65,71,75,76.80,85,95,100])

>>># 創建函數
>>>def f(x):
>>>    x1,x2 = x
>>>    return b-(x1*a+x2)

>>>res = leastsq(f,[1,10])
>>>k,p = res[0]
>>>print(k,p)

>>># 畫圖
>>>plt.figure(figsize=(8,6))
>>>plt.scatter(a,b,color="green",label="Samples",linewidth=2)

>>>x = np.linspace(0,100,100)
>>>y = k*x +p
>>>plt.plot(x,y,color="red",label="fit",linewidth=2)
>>>plt.legend()
>>>plt.show()
0.9414135338344587 7.522857142851741
10. signal模塊
  • 包含信號處理的工具。

1)resample(<singal>,<num>)

  • 使用FFT將信號<signal>重采樣成<num>個點。
>>>import numpy as np
>>>import matplotlib.pyplot as plt
>>>from scipy.signal import resample

>>>t = np.linspace(0,5,100)
>>>sig = np.cos(t)

>>>sig_res = resample(sig,25)
>>>plt.plot(t,sig)
>>>plt.plot(t[::4],sig_res,'ko',color="blue")
>>>plt.show()


2)detrend(<singal>)

  • 從信號中去除線性趨勢。
>>>import numpy as np
>>>import matplotlib.pyplot as plt
>>>from scipy.signal import detrend

>>>t = np.linspace(0,5,100)
>>>sig = t + np.random.normal(size=100) # 正態分布

>>>sig_det = detrend(sig)
>>>plt.plot(t,sig)
>>>plt.plot(t,sig_det)
>>>plt.show()


3)medfilt(<singal>,<kernel_size=[]>)

  • 返回信號的中值濾波。
>>>import numpy as np
>>>import matplotlib.pyplot as plt
>>>from scipy.signal import medfilt

>>>t = np.linspace(0,5,100)
>>>sig = t + np.random.normal(size=100)
>>>sig_filt = medfilt(sig)
>>>plt.plot(t,sig)
>>>plt.plot(t,sig_filt)
>>>plt.show()


4)wiener(<singal>,<mysize=0>,<noise=0.0>)

  • 返回信號的維納濾波。
>>>import numpy as np
>>>import matplotlib.pyplot as plt
>>>from scipy.signal import wiener

>>>t = np.linspace(0,5,100)
>>>sig = t + np.random.normal(size=100)
>>>sig_filt = medfilt(sig)
>>>plt.plot(t,sig)
>>>plt.plot(t,sig_filt)
>>>plt.show()


5)spectrogram(<singal>)

  • 用于計算連續時間窗上的頻譜圖。
>>>import numpy as np
>>>import matplotlib.pyplot as plt
>>>from scipy.signal import spectrogram

>>>t = np.linspace(0,5,100)
>>>sig = t + np.random.normal(size=100)
>>>frequencies, times, spectrogram = spectrogram(sig)
>>>plt.figure(figsize=(5, 4))
>>>plt.imshow(spectrogram, aspect='auto', cmap='hot_r', origin='lower')
>>>plt.title('Spectrogram')
>>>plt.ylabel('Frequency band')
>>>plt.xlabel('Time window')
>>>plt.tight_layout()


6)welch(<singal>)

  • 用于計算功率譜密度(PSD)
>>>import numpy as np
>>>import matplotlib.pyplot as plt
>>>from scipy.signal import welch

>>>t = np.linspace(0,5,100)
>>>sig = t + np.random.normal(size=100)
>>>f, Pxx_den = welch(sig, 10e3, nperseg=1024)
>>>plt.semilogy(f, Pxx_den)
>>>plt.ylim([0.5e-5, 1])
>>>plt.xlabel('frequency [Hz]')
>>>plt.ylabel('PSD [V**2/Hz]')
>>>plt.show()
11. stats模塊
  • stats模塊包含了統計工具以及概率分析工具。

1)norm.rvs(<vars>,<size>)

  • 對隨機變量進行隨機取值,通過size參數指定輸出數組的大小。
>>>import numpy as np
>>>from scipy.stats import norm

>>>data = np.random.normal(size=10)
>>>rvs = norm.rvs(data,size=(10))
>>>print(rvs)
[-0.56467832  0.4045045   1.292464    0.70494959 -1.42089047  1.5621374
 2.33538589  0.96448403  1.47154236 -2.76150784]

2)norm.pdf(<vars>)

  • 返回隨機變量的概率密度函數(pdf)。
  • scipy.stats.norm是一個分布對象。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>from scipy.stats import norm

>>>data = np.random.normal(size=1000)
>>>bins = np.arange(-4,5)

>>>histogram = np.histogram(data,bins=bins)[0]
>>>pdf = norm.pdf(bins) # norm是分布對象

>>>plt.plot(bins[1:],histogram)
>>>plt.plot(bins,pdf)
>>>plt.show()


3)norm.cdf(<vars>)

  • 返回隨機變量概率密度函數的積分,即累積分布函數。
>>>import numpy as np
>>>from scipy.stats import norm

>>>data = np.random.normal(size=10)
>>>cdf = norm.cdf(data)
>>>print(cdf)
[0.43952227 0.37823611 0.01230109 0.40342344 0.72891795 0.38516675
0.32259791 0.10956863 0.49424769 0.58740197]

4)norm.sf(<vars>)

  • 返回隨機變量的生存函數。(1-cdf(t))
>>>import numpy as np
>>>from scipy.stats import norm

>>>data = np.random.normal(size=10)
>>>sf = norm.sf(data)
>>>print(sf)
[0.77566025 0.1372217  0.68752621 0.11581949 0.53617876 0.39929989
0.7829109  0.95804058 0.04106034 0.46006557]

5)norm.ppf(<vars>)

  • 返回累積分布函數的反函數。
>>>import numpy as np
>>>from scipy.stats import norm

>>>data = np.random.normal(size=10)
>>>ppf = norm.ppf(data)
>>>print(ppf)
[        nan         nan  1.18416881  0.77447655 -0.83857477 -0.23735722
 0.60992256 -2.12845591         nan         nan]

6)norm.stat(<vars>)

  • 計算隨機變量的參數。
>>>import numpy as np
>>>from scipy.stats import norm

>>>data = np.random.normal(size=10)
>>>mean,var,skew,kurt = norm.stats(data,moments='mvsk')
>>>print("平均值",mean)
>>>print("方差:",var)
>>>print("偏態:",skew)
>>>print("峰態:",kurt)
平均值 [-1.33302437  0.17052003 -0.27983462  0.41925024  1.09372163 -0.50300475
-0.83467595  0.58259444 -1.38216973  0.28355613]
方差: [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
偏態: [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
峰態: [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

7)norm.fit(<vars>)

  • 對一組隨機取樣進行擬合,找出最適合取樣數據的概率密度函數的系數。
>>>import numpy as np
>>>from scipy.stats import norm

>>>data = np.random.normal(size=10)
>>>mu,sigma = norm.fit(data)
>>>print("期望值:",mu)
>>>print("標準差:",sigma)
期望值: 0.33074099749118446
標準差: 0.9540964123033218

8)rv.discrete(<values=(x,p)>)

  • 獲得離散概率的分布。
  • x表示樣本空間,p表示樣本的概率。
>>>from scipy.stats import rv_discrete
>>># 篩子的概率分布
>>>x = range(1,7)
>>>p = (0.4, 0.2, 0.1, 0.1, 0.1, 0.1)
>>>dice = rv_discrete(values=(x, p))
>>>print(dice.rvs(size=10))# 投10次的分布
[2 6 4 3 2 2 3 1 1 4]

9)geom(<k>)

  • 生成幾何分布。
  • <k>是幾何分布參數。
>>>from scipy.stats import geom
>>># 篩子的概率分布
>>>p = 0.5
>>>dist = geom(p)

>>>x = np.linspace(0,6,5)
>>>pmf = dist.pmf(x)
>>>cdf = dist.cdf(x)
>>>samples = dist.rvs(10)

>>>print("概率質量函數:",pmf)
>>>print("累積分布函數:",cdf)
>>>print(samples)
概率質量函數: [0.       0.       0.125    0.       0.015625]
累積分布函數: [0.       0.5      0.875    0.9375   0.984375]
[4 2 5 1 1 2 2 4 2 3]

10)kstest(<sample>,<k>)

  • 檢驗樣本分布的擬合度(Kolmogorov-Smirnov檢驗)。
>>>import numpy as np
>>>from scipy.stats import kstest

>>>sample = np.random.randn(100)
>>>d,t_value = kstest(sample,'norm')
>>>print("d:",d)
>>>print("t_value:",t_value)
d: 0.054675325982248446
t_value: 0.92604014256369

11)normaltest(<sample>)

  • 檢驗樣本分布的正態分布擬合度。
>>>import numpy as np
>>>from scipy.stats import normaltest

>>>sample = np.random.randn(100)
>>>z,p = normaltest(sample)
>>>print("z-score:",z)
>>>print("p-value:",p)
z-score: 0.6613838959589525
p-value: 0.7184264476749593

12)描述函數

函數 含義
hmean 調和平均數
tmean -1到1之間的樣本均值
skew 偏度
describe 樣本的多種描述統計結果
>>>import numpy as np 
>>>from scipy.stats import * 

>>>sample = np.random.randn(100) 

>>>res = hmean(sample[sample > 0]) 
>>>print('調和平均數:',res)

>>>res = tmean(sample, limits=(-1, 1)) 
>>>print('樣本均值:',res) 

>>>res = skew(sample) 
>>>print('樣本偏值 = ' ,res) 

>>>res = describe(sample) 
>>>print('樣本量:',res[0]) 
>>>print('最小值:',res[1][0]) 
>>>print('最大值:',res[1][1]) 
>>>print('平均值:',res[2]) 
>>>print('方差:',res[3]) 
>>>print('偏值:',res[4]) 
>>>print('峰值:',res[5]) 
調和平均數: 0.05340852599534427
樣本均值: -0.08822566247105651
樣本偏值 =  0.16918788340625485
樣本量: 100
最小值: -2.242433436614096
最大值: 2.2075060817319594
平均值: -0.07481108493126812
方差: 0.9744617372056462
偏值: 0.16918788340625485
峰值: -0.4407854402834386
12. ndimage模塊
  • scipy.ndimage是圖像處理模塊,包括圖像矩陣變換、圖像濾波、圖像卷積等功能。

1)rotate(<img>,<n>)

  • 用于旋轉圖片<n>度。
>>>from scipy.ndimage import rotate
>>>import matplotlib.image as mpimg
>>>import matplotlib.pyplot as plt

>>># 加載圖片
>>>img = mpimg.imread('C://Users//xiaor//Desktop//qq.jpg')

>>># 旋轉圖片
>>>rot_img = rotate(img,120)

>>># 顯示圖片
>>>plt.imshow(rot_img)
>>>plt.show()


2)gaussian_filter(<img>,<sigma>,)

  • 通過高斯濾波位圖像增加某些特性(平滑、銳化、邊緣增強等)。
  • <sigma>表示模糊度。
>>>from scipy.ndimage import gaussian_filter
>>>import matplotlib.image as mpimg
>>>import matplotlib.pyplot as plt

>>># 加載圖片
>>>img = mpimg.imread('C://Users//xiaor//Desktop//qq.jpg')

>>># 處理圖片
>>>img_modi = gaussian_filter(img, sigma=2)

>>>plt.imshow(img_modi)
>>>plt.show()


3)邊緣檢測

  • 用于檢測圖片的邊緣。
  • 常用的邊緣檢測算法包括:Sobel()、Canny()、Prewitt()、Roberts()、Fuzzy Logic methods()等。
>>>from scipy.ndimage import sobel,gaussian_filter
>>>import matplotlib.image as mpimg
>>>import matplotlib.pyplot as plt
>>>import numpy as np

>>># 加載圖片
>>>img = mpimg.imread('C://Users//xiaor//Desktop//qq.jpg')
>>>img = gaussian_filter(img,15)

>>># 處理圖片
>>>sx = sobel(img,axis=0,mode='constant')

>>>plt.imshow(sx)
>>>plt.show()
13. io模塊
  • 包含輸入和輸出功能的模塊。

1)savemat(<file>,<data>)

  • 將<data>寫入MATLAB文件。
>>>from scipy.io import savemat
>>>import numpy as np
>>>import os

>>>n = np.array([1,2,3])
>>>file = savemat('data.mat',{'n':n})
>>>print([x for x in os.listdir("C:\\Users\\xiaor\\") if x.endswith(".mat")])
['data.mat']

2)loadmat(<file>)

  • 讀取MATLAB文件。
>>>from scipy.io import loadmat
>>>import numpy as np
>>>import os

>>>file = loadmat('data.mat')
>>>print(file['n'])
[[1 2 3]]

3)whosmat(<file>)

  • 列出MATLAB文件中的變量, 可以在不加載文件的情況下查看文件概要內容。
>>>from scipy.io import whosmat
>>>import numpy as np

>>>file = whosmat('data.mat')
>>>print(file)
[('n', (1, 3), 'int32')]

參考資料


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內容

  • 一、numpy概述 numpy(Numerical Python)提供了python對多維數組對象的支持:ndar...
    L_steven的貓閱讀 3,486評論 1 24
  • 1、Numpy是什么很簡單,Numpy是Python的一個科學計算的庫,提供了矩陣運算的功能,其一般與Scipy、...
    hao小子閱讀 798評論 0 1
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,713評論 0 3
  • 工作紀要 時間:2019年12月17日 星期二 參加人員:Bruce 1.進行周二的課程(201911+20181...
    雨滴教育人事張月月閱讀 70評論 0 0
  • 我想了很久,想寫寫自己的事情,想寫寫自己的想法。 那些難過的過往不是拿來賺取同情,只是些前車之鑒,我知道那樣的日子...
    千字君上閱讀 182評論 0 0