pythonscipy教程_Python教程:进击机器学习(五)--Scipy《转》

Scipy简介

Scipy是一个高级的科学计算库,它和Numpy联系很密切,Scipy一般都是操控Numpy数组来进行科学计算,所以可以说是基于Numpy之上了。Scipy有很多子模块可以应对不同的应用,例如插值运算,优化算法、图像处理、数学统计等。

以下列出Scipy的子模块:

模块名功能

scipy.cluster

向量量化

scipy.constants

数学常量

scipy.fftpack

快速傅里叶变换

scipy.integrate

积分

scipy.interpolate

插值

scipy.io

数据输入输出

scipy.linalg

线性代数

scipy.ndimage

N维图像

scipy.odr

正交距离回归

scipy.optimize

优化算法

scipy.signal

信号处理

scipy.sparse

稀疏矩阵

scipy.spatial

空间数据结构和算法

scipy.special

特殊数学函数

scipy.stats

统计函数

文件输入和输出:scipy.io

这个模块可以加载和保存matlab文件:

>>> from scipy import io as spio

>>> a = np.ones((3, 3))

>>> spio.savemat('file.mat', {'a': a}) # 保存字典到file.mat

>>> data = spio.loadmat('file.mat', struct_as_record=True)

>>> data['a']

array([[ 1., 1., 1.],

[ 1., 1., 1.],

[ 1., 1., 1.]])

1

2

3

4

5

6

7

8

线性代数操作:scipy.linalg

假如我们要计算一个方阵的行列式,我们需要调用det()函数:

>>> from scipy import linalg

>>> arr = np.array([[1, 2],

... [3, 4]])

>>> linalg.det(arr)

-2.0

>>> arr = np.array([[3, 2],

... [6, 4]])

>>> linalg.det(arr)

0.0

1

2

3

4

5

6

7

8

9

比如求一个矩阵的转置:

>>> arr = np.array([[1, 2],

... [3, 4]])

>>> iarr = linalg.inv(arr)

>>> iarr

array([[-2. , 1. ],

[ 1.5, -0.5]])

1

2

3

4

5

6

快速傅里叶变换:scipy.fftpack

https://blog.csdn.net/q583501947/article/details/76735870

首先我们用numpy初始化正弦信号:

>>> import numpy as np

>>> time_step = 0.02

>>> period = 5.

>>> time_vec = np.arange(0, 20, time_step)

>>> sig = np.sin(2 * np.pi / period * time_vec) + \

... 0.5 * np.random.randn(time_vec.size)

1

2

3

4

5

6

如果我们要计算该信号的采样频率,可以用scipy.fftpack.fftfreq()函数,计算它的快速傅里叶变换使用scipy.fftpack.fft():

>>> from scipy import fftpack

>>> sample_freq = fftpack.fftfreq(sig.size, d=time_step)

>>> sig_fft = fftpack.fft(sig)

1

2

3

Numpy中也有用于计算快速傅里叶变换的模块:numpy.fft

但是scipy.fftpack是我们的首选,因为应用了更多底层的工具,工作效率要高一些。关于scipy.fftpack更多文档。

优化器:scipy.optimize

scipy.optimize通常用来最小化一个函数值,我们举个栗子:

构建一个函数并绘制函数图:

>>> def f(x):

... return x**2 + 10*np.sin(x)

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

>>> plt.plot(x, f(x))

>>> plt.show()

1

2

3

4

5

如果我们要找出这个函数的最小值,也就是曲线的最低点。就可以用到BFGS优化算法(Broyden–Fletcher–Goldfarb–Shanno algorithm):

>>> optimize.fmin_bfgs(f, 0)

Optimization terminated successfully.

Current function value: -7.945823

Iterations: 5

Function evaluations: 24

Gradient evaluations: 8

array([-1.30644003])

1

2

3

4

5

6

7

可以得到最低点的值为-1.30644003,optimize.fmin_bfgs(f, 0)第二个参数0表示从0点的位置最小化,找到最低点(该点刚好为全局最低点)。假如我从3点的位置开始梯度下降,那么得到的将会是局部最低点 3.83746663:

>>> optimize.fmin_bfgs(f, 3, disp=0)

array([ 3.83746663])

1

2

假如你无法选出the global minimum的邻近点作为初始点的话可以使用scipy.optimize.basinhopping(),具体就不展开描述。关于这个模块的其他功能,参考scipy.optimize

统计工具:scipy.stats

首先我们随机生成1000个服从正态分布的数:

>>> a = np.random.normal(size=1000)

#用stats模块计算该分布的均值和标准差。

>>> loc, std = stats.norm.fit(a)

>>> loc

0.0314345570...

>>> std

0.9778613090...

#中位数

>>> np.median(a)

0.04041769593...

1

2

3

4

5

6

7

8

9

10

这个工具还是蛮好用的,更多参考:scipy.stats

还有像scipy的其他模块(计算积分、信号处理、图像处理的模块)就不一一介绍了。其实机器学习最基础的部分还是属于一些统计算法和优化算法。对这一部分还有兴趣继续了解的,戳这里:https://docs.scipy.org/doc/scipy/reference/index.html

Python中关于科学计算的工具就介绍到这里。

https://blog.csdn.net/q583501947/article/details/76735870

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值