走过年,每年千万下载量,科学计算开源库的前世今生

核心提示机器之心报道机器之心编辑部每年千万下载量,科学计算开源库 SciPy,你已经是个成熟的小伙伴了。作为科学计算中的中流砥柱,SciPy 从 2001 年到现在已经走过了十九个年头,它为最优化、积分、微分方程等各种数值计算提供了完整的流程,也为

机器心脏报告

机器之心编辑部

每年几千次下载,科学计算开源库SciPy,你已经是一个成熟的小伙伴了。

SciPy作为科学计算的中流砥柱,从2001年至今已经走过了十九个年头。为优化、积分、微分方程等各种数值计算提供了完整的流程,也为科研分析人员提供了最有用、最高效的开源库。

前天2月3日,SciPy的维护者在Nature Methods上发表了一篇论文,回顾了SciPy开发的里程碑和关键技术。借助SciPy 1.0这个成熟的符号,展示了当前的科学计算和未来的发展方向是什么。

论文地址:https://www.nature.com/articles/s41592-019-0686-2SciPy项目地址:https://github.com/scipy/scipy

为什么SciPy如此重要?

SciPy是Python的开源科学计算库。自从2001年首次发布以来,SciPy已经成为Python语言科学算法的行业标准。该项目拥有超过800个独特的代码贡献者,数千个相关的开发包,超过150,000个依赖的存储库和每年数百万次的下载。在下面的简要介绍中,将总结SciPy 1.0的功能和开发实践,并重点介绍一些最新的技术发展和更新。

SciPy是一个基于Python和Numeric的开源代码包。当前模块集包括上图中的内容。

项目覆盖范围

SciPy提供了科学计算的基本算法,涵盖了现有数学软件分类体系中的算法。SciPy的目标是在迭代相对较慢的领域提供完整的算法覆盖。

在其他领域,它提供基本组件,并与该领域的其他软件包进行良好的交互。例如,SciPy提供了人们期望在统计学教科书中找到的基本算法,但Statsmodels提供了更高级的统计预测和推断方法。虽然scikit-learn涵盖了机器学习,但是PyMC、emcee和PyStan涵盖了贝叶斯统计和概率建模等。

SciPy能做什么?

我们知道,SciPy是数学、科学、工程等领域常用的库,可以处理插值、积分、优化、常微分方程数值解、信号处理等。因此,它可以用来完成自然科学领域中涉及计算的大部分工作。比如我们学习统计学,拟合一个分布,做K近邻算法,都很方便。

当然,目前新冠肺炎疫情受到广泛关注,研究人员也可以用它来模拟各种关键信息。比如中国武汉的新型冠状病毒早期传播,由中国各省市疾控中心在《新英格兰医学杂志》上发表。

获得数据后,可以使用Scipy进行许多统计分析,特别是:

研究人员根据发病日期构建感染曲线;使用对数-高斯分布来拟合暴露历史和发病日期的数据,并估计潜伏期分布。用韦伯分布拟合发病日期、初诊日期和住院日期,估计发病和住院的时间间隔分布。利用伽玛分布对病例群数据进行拟合,从而估计人际传播的时间间隔分布。

这些分析任务主要是用统计分布来拟合相应的数据,这篇肺炎论文的研究人员用MATLAB来做拟合。但实际上SciPy.status包含了100多个概率分布,这些统计分析也可以通过SciPy来完成。

面对风起云涌的疫情,无论是我们有第一手数据,还是从各个网站抓取疫情信息,使用SciPy进行建模分析都是非常好的选择。

SciPy开发里程碑

20世纪90年代末,美国梅奥医学中心的博士生特拉维斯·奥列芬特(Travis Oliphant)发布了一系列基于数值阵列构建的软件包,并提供了信号处理、特殊函数、稀疏矩阵、正交性、最优化和快速傅立叶变换的算法。

这些软件包中的Multipack是一组用Fortran和C语言打包的扩展模块,用于求解非线性方程和最小二乘问题,积分微分方程和拟合曲线。

随后,编程环境越来越丰富,合适的数值数组对象也有了,就到了开发全栈科学软件的时候了。2001年,Eric Jones和Travis Vaught创立了Enthought科学计算解决方案。

后来,为了简化工具堆栈,他们创建了一个以SciPy库为中心的SciPy项目。这个项目的发展势头非常强劲。2001年2月,网站和代码库上线,6月公布邮件列表,8月推出Scipy版。

SciPy早期版本的文档较少,但是随着2006年Numpy guide的发布,这种情况开始改变。2007年,Sphinx document Generator使SciPy能够从包含Python代码的纯文本自动呈现超文本和PDF文档。2008年,Pydocweb工具使SciPy能够以维基百科的方式开发协作文档。

在早期的SciPy workshop中,一些反复出现的主题反映了SciPy的开发状态,这些主题集中在底层的数组包、绘图、并行处理、加速/打包和用户界面。2004年,关于SciPy应用于科学计算问题的内容开始出现。

图1:从2001年0.1版本发布到2017年1.0版本推出,SciPy发展的一些里程碑事件。

SciPy近三年的关键技术

从2001年0.1的发布到近几年SciPy 1.0成熟版本的发布,SciPy在最近三年在科学计算方面积累了更多的技术。我们可以用更少的计算能力运行更大的矩阵计算,以更简洁的方式拟合更复杂多样的概率分布,或者运行最新的优化方法。本文主要研究SciPy的关键技术。

数据结构:稀疏矩阵

Scipy.sparse提供了七种稀疏矩阵数据结构或稀疏格式。最重要的是压缩行/列的稀疏格式,分别是CSR和CSC。这两种方法都提供了快速主轴索引和快速矩阵向量乘法,这两种稀疏格式广泛用于SciPy和依赖数据库。

从新特性来看,scipy.sparse matrix和linear operator现在都支持Python矩阵乘法。

cKDTree

Scipy.spatial.ckdtree模块实现了空之间分区的数据结构,将数据点组织成k维空。整个cKDTree模块通过模板类用C++重写,增加了对周期性边界条件的支持。它经常被用来模拟物理过程。

2013年,基于cKDTree.query的k近邻算法的时间复杂度接近对数线性。2015年,cKDTree二叉树计数算法得到加强,支持加权,这对于很多科学应用非常重要,比如计算星系的关联函数。

统一到编译后的代码:LowLevelCallable

在SciPy 0.19,用户可以直接使用SciPy。LowLevelCallable对象来包装底层函数,从而减少直接从Python调用编译好的C函数的开销,这些函数可能是由Numba或Cython生成的。

数学优化

Scipy.optimize子包为解决各种类型的“求根”和优化问题提供了数学解决方案。

在表1中,研究人员详细比较了所有最小化方法的特征。这些特征说明了SciPy要达到相对完整的水平,需要覆盖的数值方法或主题。

统计分布

Scipy.status包含100多种概率分布:96种连续分布和13种离散单变量分布,以及10种多变量分布。这种实现依赖于一个一致的框架,该框架提供了一种抽样随机变量的方法来评估累积分布函数指数和概率密度函数指数,并且适用于每个分布参数。

测试套件

当改变代码时,测试驱动开发被认为是一种管理不确定性的方法。对于SciPy的每个组件,研究人员编写了各种可执行的测试,可以验证它们的预期行为。这些小的可执行测试的集合被称为“测试套件”,它增强了正确性和准确性的信心,并允许用户在不改变其预期行为的情况下修改现有代码。

图2: Python和不同版本的SciPy中编译的代码量。

除了确保单元测试通过之外,确保SciPy代码库的性能能够随着时间的推移而得到改进也很重要。例如,下面的图3显示了scipy.spatial. cKDTree.query在大约9年的项目开发中的性能改进。

图3:从cKDTree的提出到SciPy 1.0的发布,scipy.spatial.cKDTree.query的基准测试结果图中每个标记表示SciPy主分支中提交的基准测试的执行时间。

SciPy还在路上。

SciPy项目每6个月更新一次。任何有兴趣和技术能力的开发人员都可以参与贡献代码。尽管SciPy的RD成本已经超过1000万美元,该项目仍然没有财政支持。这些代码都是大学研究生,学术界和工业界的人在业余时间做的。

SciPy拥有庞大的开发社区和庞大的用户群。2017年,通过PyPI的下载量为13096468次,而通过conda的下载量为5776017次。

然而,SciPy继续取得进展。下表是一个不断更新的文档,描述了团队在项目中所做的改进和推广工作。这份文件也提到了一些需要改进的地方。

 
友情链接
鄂ICP备19019357号-22