python 三剑客

嗯,今天终于让我的 matplotlib 正常的画出来图了,看来后 matlab 时代又多了一个可以依赖的数值计算工具,那就是 python 的数值计算三剑客 numpy、scipy 和 matplotlib。从某个角度来说,其实除了 matlab 以外的确有不少选择,如 octave、GNU R 或者 scilab 之类的。每个软件都有自己的一些优点,当然也会有某些缺点。那么 python 系的优点自然就是作为一个 general purpose 的 programming language 和大量的标准库 module 让你能对很多问题给出快速的解决方案,最后这三个 module 详尽的 docs 绝对和 Matlab 自己的帮助有的一比。缺点包括没有 matlab 那么多牛 x 的 toolbox(依照这三个 module 顶多分别实现了 matlab 矩阵计算和一些基本数据结构,最常用的几个 toolbox 如信号处理、统计和优化的最简单的功能,可视化的部分功能)。这里有一个与 matlab 的比较

numpy

我们首先看看 numpy 这玩意究竟给我们了一些什么功能。编译 numpy 需要的一些库如 ATLAS 或者 umfpack 之类的时候第一点发现是 numpy 和 matlab 的思路差不多,底层的运算打包给了优化的 C/FORTRAN 实现的 BLAS,并且利用这些数值包里面给的 linear system solver 和 eigenvalue solver(如 LAPACK)实现基本的矩阵操作。numpy 向 matlab 学习了不少很便捷的函数,如 linspace、eye 等方便用户创建需要的矩阵。

scipy

scipy 是一些科学计算中常用的操作的集合,包括

  • cluster,聚类算法包括 vq 下面的 vq(vector quantization)、whiten(数据进行白化)、kmeans(2)(这个太有名了);hierarchy 下面的提供几个层次聚类算法(linkage、single、complete 和 average),以及将层次聚类的结果转换成 flat cluster 的方法(fcluster、fclusterdata 和 leaders),绘制 dendrogram 的功能
  • constants 包括常用常数,比如常用的光速 c、普朗克常数等
  • fftpack 进行快速 Fourier 变换,这个跟 matlab 的类似,(i)fft(2n) 以及 (i)dct
  • integrate 包括积分和 ODE 的 solver,提供了类似 Matlab 的 quad、Gauss 方法的和 Romberg 方法、Simpson 公式等,ode 和 odeint 求解常微分方程
  • interpolation 进行插值的函数:与 Matlab 类似的 interp1d,主要是 FITPACK 相关的 port
  • io 进行 IO 的函数,对 matlab 的 save/load 的实现为 savemat 与 loadmat,另外一些格式不是很熟悉,也提供了对音频文件的支持(如 wav)
  • linalg 线性代数部分:如线性方程组的解(solve),逆和伪逆(inv、pinv),行列式的值(det)、范数(norm),kron(Kronecker 乘积);特征值问题的求解如 eig;各种分解(如 lu、svd、cholesky、schur、qr 等);创建特殊矩阵(hankel、hilbert、leslie 等)
  • misc 里面包含求导(derivative)、阶乘(factorial)、图像方面的(imread 等 matlab 等价)、fromimage(与 PIL 交互)
  • ndimage 做 digital image processing 的部分:filters 提供了常见的 image filtering 的滤波器和卷积函数(类似 matlab),fourier 下的一些 fourier 滤波,interpolation 下对矩阵(图片)进行仿射变换等,measurements 提供了一些统计相关的信息(如 histogram、最大最小),morphology 提供了一些形态学方面的东西
  • odr 包括 orthogonal distance regression
  • optimize 包括一些 generic optimizer (类似 fmin、提供了 CG 和 l-BFGS 等,甚至还有一些 anneal、brute)和 root solver(二分法、Newton 法等、fsolve)、拟合如 curve_fit,utility 函数(line_search 与 check_grad)
  • signal 包括信号处理的函数,也提供了 fft 和 convolution 相关的函数、B 样条、滤波器以及滤波器设计相关函数(似乎跟 matlab 信号处理的工具箱类似?)、小波
  • sparse 对稀疏矩阵求解的函数,如稀疏矩阵的容器,以及相关的一些成员函数能完成基本的操作(转置),在 linalg 里面提供了稀疏矩阵相关的线性代数的操作(如 spsolve、eigs)
  • spatial 包括空间数据的处理,如建立 kdtree,另外有 distance 下几种距离,还有 pdist(pairwise 距离)
  • special 包括特殊函数:Bessel 函数(jn、jn_zero)、airy、ellipj 等椭圆积分相关的,等等
  • stats 包含常用分布函数和随机数产生,rv_continuous 提供了 pdf、logpdf、cdf、logcdf、以及许多求相关的 moment、entropy 等信息的函数,对应有 rv_discrete 提供的一族,只是很多名字不这么叫;另外有一些 test 的实现;mstats 提供了带 mask 的统计量的计算,kde 提供了密度估计,
  • weave 用于 C/C++ 接口,据说可以直接编译某些 c/c++ 函数直接运行…

matplotlib

matplotlib 实现了一个基本的 visualization 界面,其中  pyplot 是主要的画图命令部分。另外它还提供了一个 pylab 环境,这是模仿 matlab 提供的一个交互式环境。

下面是一个使用这些东西实现的 PCA 以及例子。

#!/usr/bin/env python

import numpy as np
import scipy as sp

def pca (X, dim):
    mu = np.reshape (np.mean (X, 1), [X.shape[0], 1])
    X -= np.repeat (mu, X.shape[1], axis=1)
    U, S, V = sp.linalg.svd (X, full_matrices = False)
    return mu, U[:, :dim], S[:dim]

if __name__ == '__main__':
    import matplotlib.pyplot as plt
    import scipy.stats as stats
    X = stats.norm.rvs (size=[2, 100])
    A = stats.norm.rvs (size=[2, 2])
    X = np.dot (A, X)
    mu, U, v = pca (X.copy (), 1)
    plt.figure (1)
    plt.scatter (X[0, :], X[1, :])
    plt.grid (True)
    plt.plot (mu[0], mu[1], 'ro')
    ed = mu + v * U * 0.3
    plt.plot ([mu[0], ed[0]], [mu[1], ed[1]], 'k-')
    plt.show ()

为了让 matplotlib 能正常工作,一般需要设置一个合适的 backend,我们应该编辑 ~/.matplotlib/matplotlibrc,我用的 Mac 需要设置

backend: MacOSX

其他的平台可以设置 Qt 或者 GtkCairo 等。之后我们就能生成类似如下图片的 figure 了。

PCA 示意图

值得一提的是,现在不少项目也开始采用这三个库提供的开发环境,比如 DBN。看来以后有必要积累一些 python 这方面的东西,在没有 Matlab 的日子里面,估计 python 这个还是能比较通用的。

———————-
And said, I pray you, brothers, do not so wickedly.

Advertisements
python 三剑客

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s