美文网首页 移动 前端 Python Android Java
大师兄的Python机器学习笔记:Numpy库、Scipy库和M

大师兄的Python机器学习笔记:Numpy库、Scipy库和M

作者: superkmi | 来源:发表于2020-03-15 20:08 被阅读0次

大师兄的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')]

参考资料


相关文章

网友评论

    本文标题:大师兄的Python机器学习笔记:Numpy库、Scipy库和M

    本文链接:https://www.haomeiwen.com/subject/kjiqrhtx.html