美文网首页 移动 前端 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