Python数学建模总结

简介

Python作为一门灵活性极高的动态语言,虽然在大型工程开发中使用起来坑比较多,但是作为脚本或者快速原型开发、算法实现的工具还是非常合适的。目前Python的科学计算生态已经比较完善了,虽然在仿真和特定领域工具箱等方面相比Matlab等工具仍有明显差距,但在数学建模中完全可以作为主力工具来使用。

本文假定读者有基本的编程能力、高等数学知识、一定的Python编程经验与基础的英文阅读能力。本文中不会涉及详细用法,仅仅是试图根据个人经验对Python在数学建模上的应用做一个带有主观性的总结,内容比较散,因此写的可能在结构上不会那么。。。正经。

注意:

  • 调包一时爽,要记得多亲自动手实现;
  • Python终究只是工具,用工具要建立在学习数学原理的基础上。

IDE

抛弃spyder吧,直接用pycharm专业版,用edu邮箱注册就可以免费使用正版,比spyder强大太多而且bug少,同时也更接近工业环境,总体而言是目前第一推荐的IDE,能明显提升效率。
此外,如果jupyter系列也算是IDE的话,推荐在服务器上跑jupyter lab,多开几个进程就可以多用户使用了(现在有了专门多人协作的jupyter hub,但我没用过不敢乱说),如果有必要的话再加上git,团队协作会方便一些。

常用库介绍

科学计算基础库: Numpy

Numpy可以说是python科学计算生态的基础,没有Numpy的运算速度Python在科学计算上只能爪巴。虽然Numpy是一个偏底层的库,但是其提供的api使用频率仍相当高。鉴于其重要地位就多介绍一点。

Numpy最核心的数据结构就是自定义的ndarray,类似Python原生的List,但功能丰富了太多。这篇文章总结了ndarray的基本用法与常用操作
Python NumPy - Introduction to ndarray [Must Read Tutorial]

如果你是刚刚入门,那么对维度(dimension)这个概念的理解可能会是第一个障碍。
NumPy中的维度(dimension)、轴(axis)、秩(rank)的含义 - 知乎

而与维度密切相关的,就是广播(broadcasting)机制。
https://www.cnblogs.com/jiaxin359/p/9021726.html

Numpy的数据筛选操作比原生的Python数据类型丰富很多,简单的切片方法就不太讨论,较难理解的就是花式索引(fancy indexing)。
https://www.cnblogs.com/jiaxin359/p/9021726.html

这些内容是最基础的,理解后其余的部分基本都是在ndarray这些基础的特性上的高级操作,比如线性代数运算,随机数生成,排序以及各种各样的高级维度操作。

高级科学计算库: SciPy

Scipy建立在Numpy的基础上,封装了相当多的常用算法,积分,优化,插值,信号处理,统计,稀疏矩阵等等。与Numpy有一定的重叠,不过一般Scipy的功能更强。官方文档非常详细,有什么不会用的直接查文档就好。
https://docs.scipy.org/doc/scipy/reference/tutorial/index.html

多说一句,Scipy的重积分极其难用,算个积分得定义一大堆函数(一个上限或者下限就得定义一个),用起来会比较头秃。

非常好用的数据处理库: Pandas

Pandas是一套专门用来进行数据处理与分析的工具,在处理数学建模这样少量数据的情况下非常好用(再多就用scala之类的吧,不过数模几乎不可能会用到)。学习Pandas最基础的就是学会使用Series和Dataframe类,前者是一维数据,后者是二维数据表,相似度非常高。(曾经还有三维的Pandl类,不过新版废弃了)
The pandas DataFrame: Make Working With Data Delightful – Real Python

下面的链接是一个Pandas习题集,带答案和在线Python环境,初期把这里面的操作掌握了就差不多了。
Pandas Exercises, Practice, Solution - w3resource

除了知道Pandas的常用操作,要想更好地掌握的话对于Pandas的一些底层实现也要了解,否则难以理解为什么有时候同样功能的操作运行速度差别能达到3个数量级。虽然说数学建模注重快速的算法实现而非运行时效率,但是如果可以在不明显增加代码量的情况下提高运行速度,何乐而不为呢。
下面列举的就是几个最典型的可优化点,其他性能优化可以参考这个的学习思路来。
python使用pandas处理大数据节省内存技巧_一路前行1的博客-CSDN博客
Pandas常见的性能优化方法 - 知乎

与Python科学计算生态完美融合的概率统计库: Statsmodels

Statsmodels的接口设计很人性化,而且与Pandas配合起来非常好用,再加上这个库经常会使用patsy库辅助来实现R风格的建模,在建模时代码可以写的很精简,在数学建模方面可以代替SPSS的大部分功能。
statsmodels 0.14.0
对于patsy,官方文档里也有很详细的说明。
Fitting models using R-style formulas - statsmodels 0.14.0

大部分人用起来很丑的基础绘图库: Matplotlib

Matplotlib可以说是很多人接触Python可视化的入口了。Matplotlib的重要绘图api可以分为两大类:一种是简单地使用绘图函数,使用简单,比如plt.plot,教程到处都是;另一类则是面向对象的api,直接操作图像中的基础绘图对象–Artist,学习成本稍高,不过如果想做出定制性高的图像就必须掌握。可以参考这篇文章,里面对Matplotlib中的各种Artist解释的很清楚。
"Artist" in Matplotlib - something I wanted to know before spending tremendous hours on googling how-tos. - DEV Community

能让图画(hua)的(li)好(hu)看(shao)的高级绘图库: Seaborn

Seaborn建立在Matplotlib的基础上,是对Matplotlib的高层封装,一般而言即使只是用默认参数绘图效果也比直接用Matplotlib好得多,具体绘图效果和Matplotlib一样在官方文档gallery里面有,在此就不多做介绍了。
User guide and tutorial — seaborn 0.12.2 documentation
需要注意的是,Seaborn的底层操作离不开Matplotlib,比如最常用的,Seaborn里相当多绘图api的参数ax传入的就是Matplotlib中的axes,具体可见Matplotlib部分给出的链接。
Seaborn比Matplotlib更出色的一点是,可以更直接地操作Pandas的Series和Dataframe类,精简代码。

还挺好用的符号计算库: SymPy

Sympy是一个功能比较强大的符号运算库,对常见的求导、积分、极限、化简、多项式处理、矩阵运算等操作支持的都挺好,多数情况下完全够用了。如果专门做符号计算的话,还是用Maple吧。(我也不熟悉就不乱说了)
https://docs.sympy.org/latest/tutorial/index.html

机器学习库: SKlearn

成熟的、工业级的机器学习算法库,接口很友好,文档很完善,有需要什么算法直接用就行,基本没有坑。当然要注意数模不见得待见机器学习算法,用之前一定要多想想,而且用的话最好用知名度较高的模型,并且把数学细节说清楚,(最好能针对特定问题做点改进)。
User guide: contents — scikit-learn 1.2.2 documentation

成熟的网络科学库: NetworkX

NetworkX封装了很多主流的网络科学算法,并且支持多图数据格式的输入输出,和Gephi之类的工具配合使用时也很方便,在做图论相关题时很好用,而且往往是下一步建模优化前必不可少的步骤。
Tutorial — NetworkX 3.1 documentation

谷狗的通用运筹学工具: ortools

ortools包含了多种运筹学优化方法,包含:线性规划、约束规划、(混合)整数规划、路径规划、装箱问题、网络流、指派问题、调度问题(全列出来了)。ortools可以看作一个易用的界面,后端的求解器是可以更换的。个人感觉这个库更偏向工程一些,在建模中使用时稍微有些繁琐,比如有的api获取结果还需要使用回调函数,不过整体上还是很好用。官方文档写的不错,链接在下面。
https://developers.google.com/optimization/introduction/overview

专用凸优化求解器: CVXPY(一般也用不上)

鉴于数学建模这数据量,一般也用不上这样专门的凸优化求解器,不过如果能通过推导得出凸优化形式的问题的话,用这个库求解也很方便(而且如果你能完整地写出一个凸优化问题从抽象、建模到求解的全流程的话,已经在水平上超越相当多的队伍了)。
Welcome to CVXPY 1.3 — CVXPY 1.3 documentation

简单图像处理库: Pillow

Python的图像处理库,非常Pythonic,非常好用,同时。。。功能不咋强大。只能用来做一些简单的图像处理,比如格式转换,缩放,剪裁,高级操作还是不太行。提示一点,装pillow千万别用conda,直接用pip,否则踩坑几率非常大。

个人总结,python各种源的可靠性:pip官方源 > pip第三方源 >> conda官方源 > conda第三方源,对我没打错pip和conda之间是远大于,多次被坑后的经验。如果连pip也有问题装不了的话,直接上PyPI下载对应版本的库(注意PyPI上下载库是分平台的)。

还想要做复杂的图像处理: Opencv-python(针对数模非常不推荐,建议用MATLAB)

如果你真的想用的话,请一定一定提前熟悉一下这个库,否则比赛时能恶心到让人哭出来。官方文档Python接口部分写的跟没写一样,报错信息完全没有可读性,有的函数返回值靠自己试,比赛时你在debug上用掉的时间很可能会远远多余实现算法本身,有时还不如直接用c++接口方便。Python接口整体给人一种应付了事的感觉,如果真想在Python里用建议用pybind11之类的wrapper把c++接口包装一下,不过数模时间太紧,如果python接口短时间调不通可以考虑matlab。顺便提一句,pybind11完全可以承担工业级开发,TensorFlow目前的wrapper已经是用pybind11实现的了。

如果真的想用深度学习的话: PyTorch

这部分内容太广了,就不展开介绍。一定要记得一点,机器学习,特别是深度学习方法在数模中可不一定受待见,用之前一定要想好。如果真的想用的话,用PyTorch。Caffe如果没事先配好环境的话估计第一天模型跑都跑不起来,TensorFlow虽然性能好,但是那奥力给一样的api和文档简直是用来折磨用户的。

小波变换库: PyWavelets

小波变换之类的频域分析手段在数模里其实不怎么常用,但是以备不时之需还是提一下,有需要时知道有这么个库能用就好,就不用换其他工具了。(虽然信号处理还是首推matlab)

其他

利用好PyPI,用pip search命令搜索想要的库,很多数模里常用的算法,比如TOPSIS,层次分析早已有人实现过,不过项目很小不出名罢了,如果加以利用的话能节省不少时间。不过注意一点就是这种小众的库可能会有坑,有时间可以提前试试水或者干脆自己实现。

你可能感兴趣的:(数学建模,python,开发语言)