以下列出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.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.]]).关于这个模块的文档:https://docs.scipy.org/doc/scipy/reference/io.html#module-scipy.io
##线性代数操作: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比如求一个矩阵的逆:
>>> arr = np.array([[1, 2], ... [3, 4]]) >>> iarr = linalg.inv(arr) >>> iarr array([[-2. , 1. ], [ 1.5, -0.5]])更多关于scipy.linalg .
##快速傅里叶变换:scipy.fftpack 首先我们用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)如果我们要计算该信号的采样频率,可以用scipy.fftpack.fftfreq()函数,计算它的快速傅里叶变换使用scipy.fftpack.fft():
>>> from scipy import fftpack >>> sample_freq = fftpack.fftfreq(sig.size, d=time_step) >>> sig_fft = fftpack.fft(sig)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()如果我们要找出这个函数的最小值,也就是曲线的最低点。就可以用到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.30644003,optimize.fmin_bfgs(f, 0)第二个参数0表示从0点的位置最小化,找到最低点(该点刚好为全局最低点)。假如我从3点的位置开始梯度下降,那么得到的将会是局部最低点 3.83746663:
>>> optimize.fmin_bfgs(f, 3, disp=0) array([ 3.83746663])假如你无法选出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...这个工具还是蛮好用的,更多参考:scipy.stats
还有像scipy的其他模块(计算积分、信号处理、图像处理的模块)就不一一介绍了。其实机器学习最基础的部分还是属于一些统计算法和优化算法。对这一部分还有兴趣继续了解的,戳这里:https://docs.scipy.org/doc/scipy/reference/index.html Python中关于科学计算的工具就介绍到这里。
Ref:http://www.scipy-lectures.org/intro/scipy.html