资源经验分享如何从 Matlab 过度到 Python

如何从 Matlab 过度到 Python

2020-03-06 | |  58 |   0

原标题: 如何从 Matlab 过度到 Python

来源:AI研习社     链接:https://www.yanxishe.com/TextTranslation/2428


我谈到了我是如何在工业界找到工作的。当我得到第一份非学术性的工作时,我已经断断续续地为Python编程10年了。精通一门人们在学术界以外使用的语言将提高你在工业界找到工作的机会。学习一门新的语言也会提高你作为一个程序员的能力,并且会开启你原本不敢处理的新项目和分析。


如果你在一个使用Matlab多年的实验室里,却没有机会学习Python呢?下面是我从Matlab过渡到Python的指南。在本文的最后,有一些神经科学的特定链接,但是对于任何从Matlab背景接近Python的人来说,它应该是有用的。



苦学Python


Python是最流行的语言之一,比Matlab流行至少10倍,而且绝大多数从Matlab过渡过来的人都会选择它。这里有两个基本策略可以应用:



  • 迁移学习(又称简单方法)。在Matlab中,你每天都会用到一些东西——数组操作、绘图、信号处理等等。在Python中,你也学会了做同样的事情,也许借助于一个备忘单。很多Python数据科学API(尤其是numpy、scipy和matplotlib)都非常类似于Matlab。它们最初是为了在Matlab中复制功能而构建的。有了这条路线,你会以非常快的速度获得适度的生产力。

  • 从零开始(也叫艰难的道路)。学习语法,然后做一些在Matlab中做不到的事情,例如:  

                      学习算法和数据结构
                      制作一个GUI应用程序(例如在PyQT中)
                      做一个游戏
                      创建动态网站

我有点争议的观点是你最好从头开始。如果你使用迁移学习方法,你的工作效率会比你现在长时间的工作效率低。你会对自己的无能感到恼火(“我为什么要这样对自己?我可以做同样的事情,速度是原来的两倍!“)。此外,你会倾向于用Matlab的方式(对所有事情使用矩阵、索引链、避免循环)做一些容易出错的事情,而你不应该用通用编程语言来做。

从零开始,你会学到以前根本做不到的新东西——你会觉得自己拥有了新的力量。你可以写一个图形用户界面!你可以做动态可视化!你可以做游戏!你可以做深入的学习!你的日常生产力不会受到影响,因为你将学习新技能,而不是重新学习旧技能。在Python中,您将比在Matlab中更有效率。您将编写惯用代码。

学习Python需要多长时间?

500小时。好吧,这个数字是编造出来的,但可能离事实不远。你可以在周末学习语法。你可以在几天内完成你的第一个重要项目。然而,熟练是随时间而来的。不要等到技术面试前3周才开始学习。我见过候选人这样做,不好。如果你手头上没有数百小时的Python,你最好在Matlab中请求面试。从今天开始,每天坚持下去(一天1-2个小时就足够了),这样会有回报的。


为什么Python这么受欢迎呢?

约书亚本吉奥。再说一次,我是在开玩笑,但是人们离开Matlab的一个最大原因是为了深入学习而采用了Python。它始于本吉奥实验室的西亚诺,建立在努比、希比、斯科莱恩和朱庇特的基础上,所有这些都早于深度学习的兴起。接着是Tensorflow。谷歌的人已经在使用Python了;Python的创建者Guido van Rossum曾一度被谷歌雇佣。谷歌需要一种高级语言来在模型上快速迭代;许多参与Theano的人都参与了Tensorflow。Python说得通。  

它可能会以另一种方式降落。如果Yann战胜了Yoshua,我们可能都会使用Lua!但是,再加上行业压力、大量资金、教育部门需要良好的第一语言以及开源,Python现在已经是一个巨大的成功。将来可能会改变。也许我们将来都会用斯威夫特。或者生锈。或者朱莉娅(我个人最喜欢的!)。目前,Python是需要学习的语言。

我甚至不讨厌Matlab

我广泛使用了Matlab。我已经足够深入到创建自己的mex文件和使用Java。我在GUIDE中创建了gui。我已经创建了相当大的代码库和类。我甚至编写了自己的神经网络框架,但从未发表过。

我不想在这里抨击Matlab。你可以用Matlab编写好的代码——很多使用Matlab多年的人最终都会编写出规范的代码。然而,我已经看到了很多特定类型的Matlab代码——使用矩阵来处理所有事情(尽管Matlab有数据帧和哈希映射!),避免for循环(即使它有很好的JIT!),在GUIDE中使用一组巨大的globals(我敢肯定,有一种编写好的GUIDE应用程序的方法!)。如果你有这些旧习惯,要想改掉就得花点功夫。


课程

如果您从未见过或接触过Python,那么可以通过在线资源学习语法和基本数据结构(元组、dict和列表)。

一些示例网站包括:


学习Python。跳过numpy和pandas教程,我们稍后再讨论。
编解码器。类似的。
Learn Python The Hard Way  。这本书有很多练习题。30美元。
用Python做艺术品。如果你对游戏和互动艺术感兴趣,这可能会吸引你的注意力。30美元。


这些网站大多会直接在网站上进行某种现场评估。很快您就需要在本地安装Python。我建议安装Python 3的Anaconda发行版。这包括conda环境管理器,它允许您维护不同的包集。

选择第一个项目


现在,您可以考虑将Python用于一个项目(还没有数据科学方面的内容)。我制作的第一个应用程序是一个将文件上传到网站的GUI。几年后,我在PyQT中制作了一个应用程序,用笔记注释生理记录。你可以建立一个网站。很多不同的项目,但基本上要确保你涵盖了基本内容,意思是:


  •   功能-这些会让你绊倒。Python具有对象类型的按引用传递语义。在Matlab中,函数不能修改它的参数(除非它是一个引用对象,但这些是很少见的)。但在Python中,您可以处理您的参数:

def my_append_fun(a)    a.append('b')
c = ['a']
my_append_fun(c)
print(c)# Prints ['a', 'b']

这样做是不好的做法,但你可能会不小心这样做,你会很困惑。


  • 模块-在Matlab中,一个文件=一个函数(除非它是该文件专用的内部函数)。在Python中,一个文件中可以有多个函数和类。每个文件都定义了一个可以导入的模块。还有其他人的模块!皮普!理解如何以及何时访问某个模块或函数是Python的一个微妙之处。

  • 元组、听写和列表。固定长度组的简单只写类型;超级强大的hashmap类型;以及可变长度向量。您需要一段时间才能了解每种类型的权衡。你的假设是错误的!您可能认为在for循环中附加到列表是超慢的,因为在Matlab中附加到向量是超慢的。错了!它真的很快。

  • 上课。类是行为+数据。也许你在Matlab中做过面向对象编程。如果没有,是时候捡起来了!

  • 字符串和文件IO。格式化字符串、使用语句、StringIO、regex——这些都是通用编程语言中的工作内容,在Matlab中您可能从未接触过。

数据结构和算法

考虑学习数据结构和算法。许多专业程序员都是自学成才的,从来没有真正了解过这些基本原理。他们直观地了解什么是缓慢和快速的,并可以编码许多非平凡的算法。他们甚至可以使用复杂性分析(O符号)。

一旦你学会了数据结构,你的世界就会打开。这对于有着Matlab背景的人来说尤其如此,因为这种语言往往会迫使你一次又一次地使用相同的结构(矩阵)。您可能不知道如何处理元组、dict、列表和对象。你需要一些坚实的基础来转换出Matlab所提出的奇怪的编程模型。


学习Tim Roughgarden在Coursera上的算法和数据结构课程。这些课程和你在斯坦福大学的计算机科学课一样,非常好。真的很难。你会觉得你的思想在融化——以一种很好的方式。

你可以试试每天的挑战,比如哈克朗。如果你更喜欢数学的话,还有欧拉计划

数据科学生态系统


终于到了学习数据科学管道的时候了。因为您已经很好地学习了基本的Python,而且这些工具与Matlab非常相似,所以您的转换将非常顺利。这里有一个指导您了解Python数据科学生态系统的教程。这意味着要熟悉:


用于打印的matplotlib
矩阵的numpy
信号处理用scipy
数据用pandas
机器学习的sklearn
动态笔记本的jupyter


对于许多来自Matlab背景的人来说,最难学习的软件包是pandas。为什么有人想用pandas?我不能用矩阵吗?


你的博士生导师告诉过你多少次在你的图上标注坐标轴?一千次?标记轴对于理解数据的含义很重要。当你索引到一个未标记的矩阵时,比如df(:,7),你可能会忘记数据的含义。使用df.reaction_time_ms不是更好吗?对!


您甚至可能已经学会了如何对原始矩阵进行精简、查询和聚合。此代码可能会给出参与者10的平均反应时间:


mean(df(df(:, 1)==10, 7))


真糟糕!如果在CSV中添加一个列呢?然后第7列变成第8列,你的统计数据是错误的,你将失去几个月的追踪问题。这段代码非常容易出错,让小猫哭闹。我并不是说在Matlab中不可能用正确的方法来实现这一点——我只是说人们通常是这样做的。比较pandas的方式:

df.query('participant_id == 10').reaction_time_ms.mean()

花点时间完整地阅读pandas教程。过一段时间后,您可能还想拿起一本书,例如数据科学的Python

现在,你需要练习你的新技能。参加Kaggle竞赛参加数据科学MOOC


神经科学专用工具


在这一点上,您可能有足够的生产力来每天使用Python。祝贺 你!现在是学习Python神经科学工具的好时机:


核磁共振机器学习的nilearn方法
brian 用于尖峰神经网络模拟
用于安装ANN的Pythorchtensorflow
deeplabcut追踪没有标记的动物
视觉刺激呈现的心理疗法
neo用于Python中的电生理数据管理
EEG分析用MNE
贝叶斯推理的PyMC3


知道另一个不可或缺的工具吗?写在评论里。

将现有管道转换到Matlab


很难将多年来开发的管道从Matlab批发到Python。您需要将运行管道后获得的数据冻结为可以从Matlab传输到Python的文件格式。Matlab的.mat文件格式在Python中是可读的。由于v7.3.mat文件采用hdf5文件格式,因此Python对该格式有极好的支持。


在将来,您可能会发现您只需要很少的Matlab,而且只需要维护一个或两个顽固不化的管道。你可以把这些管道包装成docker的图片,这样它们在未来的几年里都会继续工作,尽管操作系统和Matlab版本发生了变化。

精通


你可以开始开发重要的代码库。你会把所有东西都放进Dropbox吗?不,你用的是git!你需要知道命令行。跟随软件课程学习Unix终端和源代码管理。


为了真正提升你的游戏水平,你需要为一个开源项目做贡献。如果你不确定从哪里开始,加入一个Brainhack活动-人们会要求志愿者为他们的项目,他们会指导你完成提交的过程。友谊将会建立!合作孵化!会有百吉饼的!


也许你现在会觉得需要速度。使用Sparkdask穿透十亿行数据集。JIT for循环或使用Cythonnumbajax将它们编译成C。有一千条平行链的蒙特卡罗模拟?没问题!


社交化


人们没有意识到社交编程是怎样的。作为谷歌的软件工程师,我:


在与其他工程师的研讨会上了解了核心工具
让别人检查我的代码
查看其他人的代码
成对编程
与批评分析的其他人共享分析(包括内容和方法)
去疗养院学习新工具
组织读书小组


我从这些经历中学到的比我读过的书和单独编程中学到的更多。你不必让你的学习之旅孤立。当你做卡格尔,加入一个团队。去参加当地的会议——例如,在蒙特利尔,有Les Pitonneux,他们几乎每天都会见面。许多团体致力于支持计算机科学中代表性不足的团体,例如PyLadies


有一些黑客空间,你可能会发现人们在同样的情况下。你可以在会议上参加辅导班。结交朋友,建立一个社会支持系统来帮助你的旅程。

结论

这些年来,我不得不重新学习编程很多次。Toolbook、QBasic、VB、Delphi、Actionscript、Perl、PHP——我用每种语言编写了大量代码。他们要么死了要么就要走了。看到这些语言的发展轨迹后,我觉得Matlab也在发展。这并不意味着它根本就不会被使用——毕竟,PHP现在的流行程度是它鼎盛时期的10倍,但它仍然运行Facebook!但这确实意味着:

了解Matlab的人会比雇佣了解Matlab的人多。这对你的简历没有任何帮助。

专业的软件工程师已经离开了Matlab。如果你选择留在学术界,你将很难雇佣专业程序员在未来的实验室中创建基于Matlab的基础设施。

Mathworks是一个单一源代码供应商,他们的软件是封闭源代码的。如果他们没有生意怎么办?

是时候离开Matlab了。今天迈出第一步!

发起:唐里 校对:邓普斯•杰弗 审核:唐里

参与翻译(1人):

邺调

英文原文:Transitioning away from Matlab

THE END

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:手把手教你解决自然语言处理 90%的问题

下一篇:解构 BERT:从 1 亿个参数中提炼出 6 个模式

用户评价
全部评价

热门资源

  • Python 爬虫(二)...

    所谓爬虫就是模拟客户端发送网络请求,获取网络响...

  • TensorFlow从1到2...

    原文第四篇中,我们介绍了官方的入门案例MNIST,功...

  • TensorFlow从1到2...

    “回归”这个词,既是Regression算法的名称,也代表...

  • 机器学习中的熵、...

    熵 (entropy) 这一词最初来源于热力学。1948年,克...

  • TensorFlow2.0(10...

    前面的博客中我们说过,在加载数据和预处理数据时...