Python Vs MATLAB
——从一次数模美赛的亲身经历谈python在数学建模竞赛中的应用
说起数学建模中的编程软件,大部分人都会想到Matlab。Matlab应该是史上功能最强大的一门编程与数学仿真软件,许多复杂的数学问题对它来说都so easy。有经验的都明白,做数模少了MATLAB是万万不能的,什么画个图像啊,搞个拟合分析矩阵计算啊啥的没了它很难玩得转,但MATLAB也不是万能的,至少,在文本数据处理方面,我认为它远不如python,这个文本数据挖掘领域的神器。
说实话,电脑安装Matlab有一年多了,但我至今还是个MATLAB菜鸟,原因一是不太喜欢Matlab的语法,二是日常生活中几乎用不到,三是不能理解复杂的矩阵运算,更不懂啥神经网络之类的算法,所以只能把它当画图工具了。但是我也参加数模比赛,比如前两次参加比赛我用的是java,编程效率不是一般的低,以至于我参加比赛时80%的时间都用在了写程序上,真心浪费了很多时间。不过这次改用python后,效率有所提高。
废话不多讲了,现在就让我们见识一下如何用Python处理数学建模问题。
一、Matlab中引入数据
在介绍Python之前,我们先来看看我们在MATLAB中是怎么引入数据的:
首先,如果是用空格,逗号,等分隔符隔开的很有规律的数据文件,引入Matlab是很简单的,像我这种小白不看任何教程也能摸索出来,步骤很简单:
<!--[endif]-->
1、点击右上方workspace框中的Import data按钮
<!--[endif]-->
2、选择数据文件
<!--[endif]-->
3、选择数据间的分隔符—>next
<!--[endif]-->
4、finish
<!--[endif]-->
现在,workspace中多了一个名为data的矩阵,说明数据引入成功了。
不得不说这种数据引入方式是很赞的,大多数数据文件可以一键引入,很省事。然而这只是对于格式有规律的数据来说的,对于格式没规律的数据,直接import显然行不通了,需要自己写程序来搞定,比如这次美赛中我们遇到的Edros0列表:
<!--[endif]-->
这组文档有18000行,记录的是著名学者Edros(很NB的)的学术合作关系网络,其中开头没有空格行且全大写的人名与Edros有直接合作的,即所谓的Edros数为1学者,共511位,比如AGOH, TAKASHI;列在他们的后面的则是与这511位学者有合作关系的学者,他们大多数与Edros没有直接合作关系,姓名只有首字母大写。当然,那511位学者之间也有互相合作,比如AGOH, TAKASHI与GRANVILLE, ANDREW JAMES,我们的任务就是,找出所有这511位之间的合作关系,得到511个节点的关系网络。
显然,对于这个问题,直接import行不通,需要自己写程序进行简单的文本分析。但是,我个人认为用Matlab的程序处理这个文本一点也不轻松,看看Matlab的文件处理函数你就知道了:fopen、fsacnf。。。——和C语言没有区别啊(不是说C语言不好而是在比赛中太浪费时间了),而且结果保存为矩阵也不方便啊,所以我想到了用python处理这个文本。
二、python中的数据处理
Python没有matlab中import data这样给力的功能,但相比Matlab,Python中的文件操作简单太多了。举个例子,python中只需2句话:
Data = open(‘XXX’) For each_line in data: 。。。
你就可以打开并遍历文件的每一行。再配合python灵活的字符串与数据操作方式,从文本中提取信息并不难,具体只要三步:
1、数据读取
用程序解决这个问题,无论用什么,第一步无疑都是文件的读取,所以我先替去除了着18000行文本,保存为data.txt,在同一目录下新建data_processer.py。然后:
Data = open(‘data.txt’) For each_line in data:
遍历文本每一行。
2、节点获取
第二步,我们要找到这511位学者所在的行并获得结点。对此,我们先分析一下文本的特点,发现除了姓名全部大写外,这些都含有四位数的年份,于是,我们可以根据数字的个数来得到这些人名的所在行,对此我写了一个函数来获取字符串中的数字个数:
def num_count(s): num_count = len(filter(lambda x:x.isdigit(),s)) return num_count
为了得到511个姓名,我们先把数字个数大于4的行根据空格分割成很多片段,记为flagments列表:
flagments = each_line.strip().split(' ')
再把年份之前的字符串都拼起来,就得到了姓名:
#找到年份对应字符串,并得到名字的函数 def find_name(flagments): index = 0 for each in flagments: if num_count(each) < 4: index+=1 else: name = '' for i in range(index): if(cmp('',name) == -1): name += ' ' name += flagments[i] return name
首先,新建一个叫all_nodes的列表,来储存所有的节点。
all_nodes = []
然后,调用函数get_nodes得到所有节点:
def get_nodes: for each_line in data: #如果这一行中含有年份,那么提取节点名称 if num_count(each_line) >= 4: #把字符串按空格分割 flagments = each_line.strip().split(' ') #得到名字 name = find_name(flagments) #添加新节点 new_node = {'id':id,'line_index':line_index,'name':name,'in_link':[],'out_link':[],'in_link_node_count':0,'out_link_node_count':0} all_nodes.append(new_node) line_of_nodes.append(line_index) id+=1 lines.append(each_line) line_index += 1#记录行号
这里,我把每个节点定义为一个字典,赋予了节点id编号、姓名name,同时新建了列表link来储存它连接的节点的id,用。另外,我还记录了每个节点的首行号,方便后面的工作。
下一步,就是得到节点间的连接关系了
3、得到节点间的连接关系
这步工作也很简单,刚才我们记录了每个节点所在行的行号,相邻行号之间的部分就是这个节点的合著者名单,把名单中的人与511个节点中的姓名一一对比,就可以得到它所连接的节点,代码如下:
#1 找到每个节点的区间,逐行匹配,找到其他的人就加一 for i in range(id): for j in range(line_of_nodes[i]+1,line_of_nodes[i+1]): for k in range(id): if cmp(all_nodes[k]['name']+'\n',lines[j])==0: all_nodes[i]['in_link'].append(k) all_nodes[i]['in_link_node_count'] += 1
OK,完成了以上几步工作,我们已经得到了构建网络所需的所有的信息——511个节点与每个节点连接信息,就可以得到关系网络了,根据all_nodes列表中的信息,配合pajek软件,我们得到这样一张网络图:
<!--[endif]-->
怎么样,是不是很有成就感,嘿嘿。
三、用Python处理JSON格式数据
在上面的例子中,我们借助Python处理文本成功构建了Edros网络,下面我们继续用Python构建另一个网络。顺便认识一下一种常见的数据格式——JSON格式。
题目的第四问,要求我们自己基于另一组数据建立另一个的网络,重新评估自己的算法。不得不说这一问不好做,因为在短时间内找到类似的数据真心很难,自己写爬虫爬数据我也不会。不过我的运气实在是太好,没费多大功夫就在数据堂网站上找到了一组名为“十三万条微博互粉记录”的数据。不是我自夸,这么合适的数据简直就像是为本题量身打造的啊。微博关注网络,和Edros网络如出一辙啊有木有,更巧的是节点个数——521个,和511个很相近有木有!!!
废话不多讲,就让我们先来看看这组数据的真面目。
<!--[endif]-->
这个4兆多的文档,我截取了一小部分,说实话,一看到这组数据我就笑了——这不就是python中的字典打印出来的格式吗!后来我查了资料,知道原来这种格式叫JSON格式,源于JavaScript。详见百度百科:
http://baike.baidu.com/link?url=IWjHSgBSGudp0w6sKwrRRbiIIL2tXL4wfzu-uTC052mzvA4BKdHO2BoYRLajAFc0
这组数据中同样用字典来定义节点,其中“node”为节点对应的微博号码,“count”为该用户的关注数,“biFriends”为用户关注的用户id列表。
由于本来就是Python默认的数据输出格式,所以使用Python来处理这组数据,出奇的简单,直接调用python内置的JSON库函数,只要几行代码:
data = open('相互关注.txt') for each_line in data: sss = json.loads(each_line) all_infos.append(sss) sss['id'] = id sss['links'] = [] id += 1
这样就把文档直接存为字典列表了。
用同样的方法,我们可以得到521个节点的微博关注网络,画出来是这个样:
<!--[endif]-->
额,乌压压的一片TOT。。。好吧,我承认,数据确实太多,以至于我自己写的这个小程序要跑整整5分钟!
我抽取的其中连接数最多的30个节点,图好看多了:
<!--[endif]-->
从图中可能看不出来,但是从统计数据中我们可以清楚地看到,id为1197161814的用户与所有其他520的节点用户都有连接,显然,这是这13万条数据的爬行起点,1197161814节点扮演的角色和Edros一样,所有的关系网络都是从他辐射出来的。
当然,除了引入这些数据,python程序进行简单的数据计算也so easy,和C语言啥的差不多,鄙人对数学模型方面也只能算个菜鸟,建模没有太多亮点,在此我就不多介绍了,所有的代码和数据文件都打包上传了,有兴趣的可以参考一下,希望能给大家一起启发,也欢迎各位提出建议,我们共同进步!
相关推荐
本教程将深入探讨如何使用Python作为服务器端(Server)与Matlab作为客户端(Client)通过TCP/IP协议进行通信,以实现数据交换和计算。TCP(传输控制协议)是一种面向连接、可靠的通信协议,它确保了数据的有序、...
SCE-UA优化算法,python和MATLAB代码,已通过常见的测试函数。 更多算法实现可参考以下博客,感谢原博主的精彩讲解。 【算法】02 SCE-UA简介及源代码 ...
基于python和MATLAB的美赛模型与代码实现.zip基于python和MATLAB的美赛模型与代码实现.zip基于python和MATLAB的美赛模型与代码实现.zip基于python和MATLAB的美赛模型与代码实现.zip基于python和MATLAB的美赛模型与...
机器学习课程吴恩达Python+Matlab代码实现.zip 机器学习课程吴恩达Python+Matlab代码实现.zip 机器学习课程吴恩达Python+Matlab代码实现.zip 机器学习课程吴恩达Python+Matlab代码实现.zip 机器学习课程吴恩达Python...
在Python中实现MATLAB的`interp2`方法是将MATLAB中的二维插值功能移植到Python环境中的一个常见需求。MATLAB的`interp2`函数主要用于处理网格数据,通过插值算法来估计网格中未定义点的数值。Python中虽然没有直接...
在本教程中,我们将探讨如何在Python环境中利用MATLAB接口来调用Simulink模型,以便构建一个强化学习(Reinforcement Learning, RL)的仿真环境。MATLAB是一款强大的数值计算软件,而Simulink则提供了图形化建模工具...
SMOP 是小型Matlab和八度到Python编译器。 SMOP将matlab翻译成python。尽管matlab和数字python之间有明显的相似之处,但在现实生活中有足够的差异使手工翻译不可行。 SMOP生成人类可读的蟒蛇,这似乎也比八度快。...
在Python编程中,有时我们需要利用MATLAB的强大计算能力,特别是在处理数值计算或信号处理等问题时。这篇文章主要讨论了如何在Python环境中调用MATLAB代码,以及解决相关问题的方法。 首先,确保Python和MATLAB版本...
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为...用于求解偏微分方程的有限元程序(python和matlab源码).zip
在本实验报告中,我们将探讨Python与Matlab两种强大的编程环境在数据分析、科学计算和工程应用中的异同。南京邮电大学的这份报告旨在让学生深入理解这两种语言的优势,并通过实践来提升他们的技能。 首先,Python是...
Python 和 MATLAB 是两种广泛应用于科学计算、数据分析和工程领域的编程语言。它们各有其独特的优势,同时也存在互补性,使得在实际项目中结合使用成为可能。本压缩包中的资源,"Python与Matlab混合语言编程_董焰民....
美赛所有赛题冠名奖,O奖,F奖的代码以及常用模型的实现以及论文复现,基于python和MATLAB两种语言。 美赛所有赛题冠名奖,O奖,F奖的代码以及常用模型的实现以及论文复现,基于python和MATLAB两种语言。 美赛所有...
该编程代码可以很好地实现python与matlab的桥接
在这个压缩包中,包含两种编程语言——Python和MATLAB实现的空间圆拟合算法。 首先,我们来看Python代码(CircleFit.py)。在Python中,通常使用numpy库进行数值计算,matplotlib库进行数据可视化。这段代码可能...
首先,Python使用的是基础数据类型,不同于MATLAB的工具箱模式,代码在Python中被组织在包(packages)中,而MATLAB使用的是工具箱(toolboxes)。另外,Python的语法与MATLAB不同,例如索引和切片操作是从零开始的...
基于暗通道去雾python和matlab代码.zip基于暗通道去雾python和matlab代码.zip基于暗通道去雾python和matlab代码.zip基于暗通道去雾python和matlab代码.zip基于暗通道去雾python和matlab代码.zip基于暗通道去雾python...
《Python与Matlab在气象水文领域处理VIIRS卫星数据详解》 在现代气象水文研究中,遥感数据的应用日益广泛,其中VIIRS(Visible Infrared Imaging Radiometer Suite)卫星数据因其高分辨率和全球覆盖特性,成为重要...
基于python和Matlab的爬虫+情感分析+时间序列+长图自动分割项目合集.zip基于python和Matlab的爬虫+情感分析+时间序列+长图自动分割项目合集.zip基于python和Matlab的爬虫+情感分析+时间序列+长图自动分割项目合集....