Dream梦想博客

一个热爱网络的90后的博客

Python,机器学习以及语言之间的战争— 一个高度主观的观点

哦,上帝,又一个主观的、明显地自以为是的标题党?是的,为什么我要写这个呢?嗯,下面这句话是我的前任教授的一个最平凡的但却改变了生活的见解和世俗智慧的名言,也成了我的口头禅,“如果你要做这个任务超过3次,那么就写一个脚本使它自动化。”
到现在为止,你可能已经开始对这个博客的猜测了。我已经半年没写过东西了!好吧,我在社交网络平台那边沉思,那不是真的:我写了一些东西–精确来说有400页左右的。这对我来说真的是一段很长的旅程。对于经常被问到的问题“你为什么选择Python机器学习?“我想是时候写我的脚本了。
在下面的文章中,我真的不是想告诉你为什么你或任何其他人应该使用Python。说实话,我真的很讨厌这样的问题。
目录:
一个复杂问题的简短回答
我最喜欢的Python工具是什么?
我觉得MATLAB怎么样?
Julia很棒。。。在纸上!
R真的没有什么错
那Perl怎么样呢
其他的选择
Python语言是一个正在衰落的语言吗?
结论
反馈和意见
一个复杂问题的简短回答
也许我应该从简短的回答开始。欢迎你停止阅读这篇文章本段以后的内容,因为它真的不属实。我是一个科学工作者,我喜欢把我的东西做完。我想有一个环境,我可以快速拥有原型并记下我的模型和思路。我需要解决非常特殊的问题。我分析给定的数据集并得出我的结论。这对我来说是最重要的:我怎么能最有效得完成工作?什么是“有效的”?嗯,我通常只运行一个分析一次(测试不同的想法和调试);我不需要一天二十四小时重复运行一段特定的代码,我并不是在为终端用户开发软件应用程序或Web应用程序。当我量化“效率”时,我估计下面几件事的时间总和,(1)它指的是将想法写成代码所需的时间,(2)调试它,(3)执行它。对我来说,“最有效”的意思是“需要多长时间才能得到结果?“现在,在过去的几年里,我认为Python很适合我。并不总是,但往往是。就像生活中所有事一样,Python不是“杀手锏”,“它不是每一个问题的“最佳”解决方案。然而,它已经非常接近最佳方案了,如果你比较编程语言在常见的和不常见的问题中的表现;Python是最通用的和最有能力的多面手。
《Python,机器学习以及语言之间的战争— 一个高度主观的观点》
记住:“过早优化是万恶的根源”(唐纳德)。如果你是软件工程团队中的一员,想让你的机器学习和数据科学部门优化下一个高频交易模型的交易规则部分,Python可能不适合你(但也许它是由数据科学团队的选择的语言,所以学习如何阅读它可能仍然是有用的,)。所以,我的一点建议是,当你选择一种语言时,先评估你的日常问题的任务和需要。“如果你拥有的是一把锤子,一切都开始看起来像一个钉子”,你太聪明了,没有掉进这个陷阱!但是,在头脑中保持一个平衡。有些场合,锤子可能是最好的选择,即使一个螺丝刀可能是“更好”的解决方案。再次,它归结为生产率。
让我给你一个我个人经验的例子。我需要开发一堆新的算法来“筛选”1500万个小的,化学化合物,关于一个非常问题的具体假设。我是一个完全计算的人,但我与生物学家合作,它们做非计算实验(我们称之为“wet lab”实验)。目标是缩小到在实验室中可以测试100个潜在的化合物。需要说明的是,他们需要快速的结果,因为他们只有有限的时间来进行实验。相信我,时间真的是有限的:“结果必须收集的几个星期前,我们的资助申请被接受了,我们得到了研究资助,就在结果必须被收集之前的几个星期。(我们的合作者做某种鱼类产卵幼虫实验只在春天做),因此,我开始思考“我怎么能尽快把这些结果给他们呢?好吧,我知道C和Fortran语言,相比与使用Python,如果我用它们实现这些算法,并在各自的语言中执行“筛选”,运行可能更快。这是一个有把握的猜测,我真的不知道它是否真的会有更快的速度。但有一件事我知道:如果我使用Python来进行开发,我可以让它在几天内运行,也许它需要一个星期才能得到各自的C版本编码了。我会担心一个更有效的实现。在那一刻,把这些结果给我的合作者这是非常重要的—“过早的优化是所有邪恶的根源。” 在节点上:同一个思路也适用于数据存储解决方案。在这里,我只使用SQLite。CSV没有意义因为我需要反复地注释和检索某些分子。我当然不想从开始到结束每一次我想查一个分子或处理它的记录时——处理内存容量的问题,都要扫描或重写一个CSV。也许,MySQL会更好。除了上述原因以外,但是,我想将这份工作尽快完成,并建立一个额外的SQL Server…没有时间,SQLite可以很好的完成这个工作。
《Python,机器学习以及语言之间的战争— 一个高度主观的观点》
判决:选择满足你的需要的语言!然而,有一点值得注意的是!一个刚刚开始的程序员在学习它之前如何知道一门语言的优点和缺点,以及该程序员怎么知道,这种语言对他来说到底有没有用?这是我要做的:在谷歌和 GitHub只搜索特定的应用程序和你的最常见的问题和任务的相关解决方案。你不需要阅读和理解代码。只看最终产品。还有,不要犹豫,问别人。不要笼统的只是问“最好的”编程语言,要具体的描述你的目标,为什么你要学习编程。如果你想在MacOS X上开发应用,你可能需要学习面向对象的C、swift,如果你想在Android平台上开发应用,你可能对学习java等更感兴趣。
我最喜欢的Python工具是什么?
如果你有兴趣,这些是我最喜欢和最经常使用的Python的工具,我几乎每天都会使用他们中的大多数。
NumPy: 我最喜欢的库,使用线性代数处理阵列结构和矢量方程;增强版的SciPy。
Theano:可以在我的GPU上实现机器学习算法一些比较繁重的计算和分布式计算。
scikit-learn:平时最方便的API,用来实现最基本的机器学习任务。
matplotlib:绘图时我会选择这个库,有时我也会使用 seaborn为一些特定的情节,例如,画一个特别大的热地图!
《Python,机器学习以及语言之间的战争— 一个高度主观的观点》
Flask (Django): 很少用,当我想把一个想法变成一个Web应用程序。这时,Flask是非常方便的!
SymPy: 用于符号数学,它取代了我原来用的WolframAlpha。
pandas: 用于相对较小的数据集,大多来源于CSV文件
sqlite3: 对“中型”数据集进行注释和查询
IPython notebooks: 我能说什么,我的90%的研究都发生在IPython notebook。它是一个伟大的环境,将所有的东西都放在一个地方:想法,代码,评论,LaTeX 方程,插图,图,输出,…
《Python,机器学习以及语言之间的战争— 一个高度主观的观点》

请注意,IPython项目最近演变成 Project Jupyter。现在你在jupyter notebook环境下不仅仅可以使用Python还可以使用R,Julia,和更多其他语言。
我觉得MATLAB怎么样?
几年前,我相当广泛地使用Matlab;大多数的计算机科学课都教授MATLAB。我真的认为这毕竟不是一个坏的的环境!因为它是用线性代数的思想建立的(矩阵实验室MATLAB),当它来实现机器学习算法时,相比Python / NumPy ,MATLAB的感觉更“自然”,好,公平来说,对我们的程序员来说,1-indexed编程语言似乎有点奇怪,但是,请记住,MATLAB带有一个很大的价格标签,而且在学术界以及工业界它正在慢慢衰落。另外,我毕竟是一个开源爱好者的粉丝。此外,相比于其它的高效的语言,它的性能也没有多么突出,看下面的基准:
《Python,机器学习以及语言之间的战争— 一个高度主观的观点》
基准时间相对于C——越小越好,C绩效= 1;
然而,我们不应该忘记,还有Python的灵巧的Theano库的。2010年,Theano的开发者报道了当代码运行在CPU上时,Theano性能比NumPy快1.8倍,如果Theano是针对GPU的,速度甚至比NumPy快11倍(J. Bergstra, O. Breuleux, F. Bastien, P. Lamblin, R. Pascanu, G. Desjardins, J. Turian, D. Warde-Farley, and Y. Bengio. Theano:Python中的CPU和GPU的数学编译。在Proc,Python科学会议的第九条,第1页–第7页,2010。)。现在,记住这个Theano的基准是2010,而且近几年Theano明显提高了很多,所以现代图形卡的能力也提高了很多。
我知道许多希腊人相信毕达哥拉斯说所有的事情都是来源与数字。这一断言提出了一个难题:那些不存在的事情是怎样被孕育产生的?——西雅娜巴豆(Theano of Croton )(哲学家,公元前第六世纪)。
PS:如果你不喜欢NumPy的点方法,敬请期待即将到来的Python 3.5,我们将为矩阵乘法提供一个中缀运算符,耶!
矩阵乘法的“手动计算”(我的意思是没有NumPy和BLAS或LAPACK的帮助,看起来繁琐且效率低下)。
《Python,机器学习以及语言之间的战争— 一个高度主观的观点》
如果我们有线性代数和库,进行优化,来对付它,谁还会希望实现这个表达式嵌套循环?
《Python,机器学习以及语言之间的战争— 一个高度主观的观点》
现在,如果这个点方式的产品不吸引你,这是它将在Python 3.5中的样子:
《Python,机器学习以及语言之间的战争— 一个高度主观的观点》
说实话,我不得不承认,我并不是“@”符号作为矩阵运算符的忠实粉丝。然而,我真的认为这是长期和艰难的,并不能找到任何更好的“未使用”的符号来实现这一目的了。如果你有更好的主意,请让我知道,我真的很好奇!
Julia很棒。。。在纸上!
我认为Julia是一个伟大的语言,我想推荐给一个开始学编程和机器学习的人。我不确定我是否真的应该。为什么?关于编程语言有这样一个可悲的,有些自相矛盾的事情。对于Julia,我们不能确定它在未来几年会一直流行。等等,“受欢迎”和编程语言多么好和有用有什么关系呢?让我告诉你。困境是,最有用的语言不一定是那些精心设计的,而是那些最受欢迎的。为什么?
1.已经有很多(大多是免费的)库,这样你就可以充分利用你的时间,不必全盘重来。
2.它是更容易找到帮助,在线的教程和例子。
3.语言提高,更新,补丁应用更加的频繁,使它“更好”。
4.它使得在团队中工作可以更好地协作也更容易。
5.更多的人会从你的代码中受益(例如,如果你决定分享GitHub上)。
就我个人而言,我爱Julia是因为什么,因为它完全符合我的兴趣。我虽然使用Python;主要是因为有太多好的东西使它特别有用。Python社区是伟大的,我相信它会在即将到来的(至少)5至10年普及并且很繁荣。对于Julia,我不那么肯定。我喜欢它的设计,我认为特别好。然而,如果它不受欢迎,我不能确定它是“未来的证据”,如果发展在未来几年就停止了呢?我所投资的事情到那时就“死”了。然而,如果每个人都这样想,那么就没有新的语言会有机会了。

R真的没有什么错

嗯,我想我曾经是一个R的使用者这件事并不是什么大秘密。我甚至写了一本关于它的书(好吧,其实准确的来说是关于使用R绘制热图。请注意,这是多年前以前,在ggplot2出现之前。没有真正令人信服的理由去仔细讨论它–我说的是我的那本书。然而,如果你无法抗拒,下面是免费的,五分钟就可以读完的简短版)。我同意,这是一点题外话。所以,回到我们的讨论:R语言有什么不对吗?我认为没有什么不对的。我的意思是,在数据科学中,它是非常强大的,一个很有能力和“流行”的语言,不久前,连微软也变得很感兴趣:微软收购革命分析,一个商业供应商服务的开源R编程语言的统计计算和预测分析。
那么,我怎么总结我对R的感觉呢?我并不知道这句话出自哪里–前段时间我在某个地方看到它–但是可以很好地解释R和Python的区别:“R是由统计人员为统计人员开发的一种程序设计语言;Python是由计算机科学家开发的,它可以由程序员使用,来运用统计技术。”这句话的一层意思是,R和Python都可以处理“数据科学”的任务,然而,我感觉Python的语法更为自然–只是个人品味。
我只是想把Theano 和其在可以在GPU上运算作为Python的一大优势,但我发现R也可以,在GPU上使用R并行编程:我知道接下来想问什么:“好吧,那把我的模型变成一个出色的Web应用程序怎么样?我敢打赌,这是你不能在R上做的事情!“对不起,但你输了这个赌注;看一下这个Shiny by RStudio A web application framework for R,你明白我的意思了吗?这里没有赢家。可能永远不会有。
拿我最喜欢的一句来自其他领域的Python格言来说:“我们都是成人了”–别浪费我们的时间在语言的战争上了。选择“单击”为您的工具。当谈到就业市场的观点:这里也没有对或错。我不认为一个公司,想聘请你作为一个“数据科学家”,却会因为你最喜欢的工具箱而困扰,毕竟编程语言只是“工具”。最重要的技能是像一个“数据科学家”思考,问正确的问题,能够解决问题。困难的部分是数学和机器学习理论,一个新的编程语言可以很容易地学习。想想,你学会了如何使用一把锤子,把钉子钉进去,那么拿起一个不同的制造商制造的锤子会很难吗?但如果你仍然有兴趣,看看下面的TIOBE指数,它可以用来衡量编程语言的普及程度:
《Python,机器学习以及语言之间的战争— 一个高度主观的观点》
然而,如果我们看看2015前十的编程语言,由 Spectrum IEEE提供,R语言上升的很快(左栏:2015,右栏:2014)。
《Python,机器学习以及语言之间的战争— 一个高度主观的观点》
我想你应该已经知道了。Python和R,真的没有什么大的区别。此外,当你选择了一种语言的时候,你不应该担心工作机会.
那Perl怎么样呢
Perl是我早期职业生涯接触的第一语言(除了在中学课程中学的Basic,Pascal和Delphi)。当我在德国还是一个本科生的时候,我参加了Perl编程课。当时我真的很喜欢它,在这一点上,我真的没有任何东西可以和它相比。但是,嘿,就我个人而言,我只知道少数人在日常的基础上常常使用Perl脚本。我认为它生物信息学领域仍然是相当普遍的,不管怎样,简单地说 “Perl死了。万岁的Perl”。
其他的选择
还有许多其他的语言可以用于机器学习,例如, Ruby(周到的机器学习:测试驱动的方法), Java (Java-ML), Scala (Breeze), Lua (Torch),等等。然而,除了一个我几年前接触过的java,或pyspark,Python 的Spark API,这是用Scala写的,对于其他语言我真的没有太多的经验,不知道说什么。
Python语言是一个正在衰落的语言吗?
这是一个合理的问题,最近它出现在Quora上,如果你想了解更多意见, 请点击question thread。然而,如果你想听到我的意见,我会说,不,不是的。为什么?好吧,Python“相对”来说是一种比较老的语言,它的第一个版本是在90年代初的某个时候出现的(可以从1991开始计数),像每一个编程语言,必须作出一定的选择和妥协。每种编程语言都有自己的怪癖,更新的语言往往会从过去的错误中吸取教训,这是一件好事(顺便说一下,R 在Python发布不久之后发布: 1995年)。Python离完美还很遥远,“就像所有其他的语言,它有它的缺点。作为一个Python核心用户,我不得不说,GIL(Global Interpreter Lock全局解释器锁)是最让我烦恼的–但需要注意的是,在一个多处理器和多线程模块,这并不是真正的限制,在某些情况下只是有点“不方便”。
没有度量可以量化编程语言是“如何好”的,它真的取决于你正在寻找什么。你想问的问题是:“我想要达到什么目的,完成这件事最好的工具是什么,如果你有一个锤子,一切看起来都像钉子。”再一次说到锤子和钉子,Python是非常灵活的,我的日常研究大部分都是使用Python 完成的,scikit-learn机器学习库,pandas用于数据修改,matplotlib /seaborn用于数据的可视化,IPython notebook用于记录所有这些东西。
结论
嗯,对于这个看似很简单的问题,这是一个很长的答案,。相信我,我可以继续几个小时或几天。但为什么会让事情复杂化呢?让我们来结束讨论吧:
《Python,机器学习以及语言之间的战争— 一个高度主观的观点》
反馈和意见
关于这篇文章,我得到了很多反馈想与你分享。记住,在某一条建议上有偏见是很自然的;你可能已经注意到,我的偏见是很青睐Python–非常抱歉,但那就是我的想法!我相信,这将有助于从其他人思考!特别是,如果你是 “数据科学”,机器学习和编程领域的新手。也就是说,请去看看那些信息下面的评论!
Python
rm999在 hackernews上的评论:
我大约一年前从R转到使用Python,我用Python来将我的数据管道合在一起(从数据源的生产模式和前端/可视化等所有方式)。相比于前几年我用任何语言,它并没有真正影响我能做什么或我的生产力,除了标准的额外搜索。使用Python的主要的原因是纯粹的实用:这是一个其他团队的人推崇并正在使用的语言。它使我可以以许多不同的方式跟别人合作:与其他团队的共享工具,转让我的代码所有权,当我需要的时候得到帮助等等。一些公司的数据科学家会一起“破解一些东西,并把它扔在墙上,让别人处理”。以我的经验来看,R只是进一步加强了这一行为。
DrNuke在 hackernews上的评论:
我喜欢在帖子中的黑客方法:一个工具只是一个工具,做一些有价值的,而不仅仅是目标本身。Python的生态系统目前是在正确的时间里,正确的工具,因为数据科学爆炸,需要很快和非专家互动。
zzleeper在 hackernews上的评论:
相当有趣的帖子。我觉得很多数字pythonistas都一样:他们认可大多数的语言,但发现R的语法有点不自然,当试图超越纯矩阵的东西时MATLAB就排不上用场了,都等着看Julia能否担起重任(这似乎是我可以告诉)。
JanneJM在 reddit上的评论:
关键是足够好的有质量的库。我认识的很多人包括我自己并不是真的对Python感兴趣。我们使用NumPy、SciPy,matplotlib,pandas等等。Python只是来凑凑热闹。如果Ruby或Perl或Lua也有这些库,那它们将是我们今天要使用的语言。
Perl
leni536在 hackernews上的评论:
“我认为Perl在生物信息学领域虽然仍很常见!?“这是真的-生物信息学中的许多日常的任务都有或多或少的纯文本解析[ 1 ],而Perl擅长分析文本并迅速使用正则表达式。“我”这一代使用Python做生物信息学的数据清理和分析(20–30),有时因为绘图,它更容易入门,它在大学中更为普遍,或其他原因——年纪大一点的使用Perl.
R
geomark 在 hackernews上的评论:
我刚刚完成了Coursera的数据科学的教程,我一个完整的新手,到现在至少有些精通。以前使用Python对很多的网站编程,开始时如果不是R强大的统计编程,我不会喜欢它。但我发现一些很好的R包,我通常以将里面有用的东西转向Python为乐。就像我最近发现的rvest包用来网页抓取。R的数据可视化是超强大的。并且使用shiny或RStudio建立一个好用的统计应用程序很容易。但R不能真的规模化到可以应用于一个大的生产应用程序,这不是吗?所以我觉得我需要同时使用Python和R,附加:这是一个很好的列表lofkin。谢谢.同时,他在文章中说,Python语法感觉更自然,我也感觉到了。但后来我开始使用R的magrittr和dplyr包,它们给你很多美好的东西,如管道,这种感觉就开始减弱了。
Adam_O 在hackernews上的评论:
从一个学生的角度来看,大多数好的在线分析/数据分析/统计课程使用R,所以在学习这些资料时很难摆脱它。一旦你了解了那些基本概念,切换到Python应该不难。我想大多数人还是喜欢使用ggplot2进行可视化。每当我用R我就感觉我像一个统计员,我能感觉到从语言发出那冷僵的感觉。但最后,我认为这是掌握这两种语言的优势。
MATLAB/Octave
sampo在hackernews上的评论:
吴恩达在Coursera的机器学习课程上说,学生在Octave / MATLAB完成课程作业比使用Python更快。但是,是的,那当然是实施和玩弄小数值算法,而链接的博客主要是关于某人从Python调用现有的机器学习库。
misiti3780在hackernews上的评论:
Octave / MATLAB是“伟大的”,但是如果你试图将它们整合到一个生产网络应用中,那我只能祝你好运了。因为你不能真的这样做,你应该避免使用它们,除非你能很好的实现相同的算法两次。MATLAB的许可证的成本钱,和工具箱的成本的钱。R是有用的,因为它有很多的资源,它已经出现这么久了,并且被大部分的统计社区使用。它也有很多有用的库还没有被移植到其他语言(ggmap!!!)。但是你仍然遇到了一个问题,那就是你不能把R整合到一个生产网络应用程序中。我敢肯定,Hadoop不支持R,Matlab/ Octave。
thanatropism 在hackernews上的评论:
这里忘记了一件事:MATLAB语法实际上是非常接近现代的语言。至少两次我写FORTRAN代码(为了Monte Carlo模拟;不同的语境)是通过重写matlab代码添加类型/一般冗长/固定的语法做循环等。
Julia
Lofkin在hackernews上的评论:
我个人很想转Julia,但缓慢的高阶函数,核心数据基础设施中的高流失率,和没有Pymc 3让我只能继续使用pydata,我有numba供我使用。
Buttons 840在hackernews上的评论:
我专业地使用Python 8年,这是我最喜欢的语言。我用过NumPy和scikit-learn一点点。即便如此,最近我真的很喜欢学习Julia。它很容易学习,并且它的性能真的很好(读:它很快)。事实上,我认为学习Julia需要像学习numba将需要大量的工作,并得到类相似的(有人说略好吗?)性能.
Idunning在hackernews上的评论:
作为一个几乎完全使用Julia来完成他们的日常工作(和侧项目)的人,我认为大多数作者的想法是Julia是正确的。我认为语言是伟大的,使用它使我的生活变得更美好。有一些软件包实际上比其他语言中的等价物的任何一个都要更好,在我看来。另一方面,我对不完美的东西也有更高的容忍度,我可以自己把事情弄清楚(幸运的是我有时间这样做),我愿意编写代码,如果它并不存在(到一个点)。当然,对大多数人来说并不是这样的,这很好。作者不愿意冒风险,并认为Julia不会“生存”太久的,这是公平的。它肯定是不完整的,但它已经到达那里。我相信它会生存(发展),并继续成长为不是单薄的社区。我有一种感觉,作者最终会以他们的方式找到属于Julia的天地,在几年左右的时间。
Niksko在 reddit上的评论:
我同意Julia的主题。它有很大的潜力,它基本上是为这些类型的应用定制的,但社区和支持,还不够好。我花了一个学期的时间做了一个小的计算进化动力学领域的研究项目,最繁琐和困难的一部分是使用Julia画出我想要的东西。那时候也没有对文档字符串的支持。它很快,它很棒,但它不够成熟。
KG7ULQ在 reddit上的评论:
当我完成了Coursera 上的吴恩达的机器学习课程以后,我环顾四周,似乎要做的事情都是使用Python。但有几个大的库,包括你提到的那些必须学会的。然后我看了一下Julia,并认为我可能会把它学好,因为它已经有了所有的线性代数和SIMD,并且它的性能更好一些。对与机器学习来说,它真的似乎是“甜点”的语言。
其他语言(我忘了提到的)
leni536在hackernews上的评论:
C++没有什么错。我使用armadillo 库处理线性代数,它真的是LAPACK和BLAS很漂亮的包装(并且很快!)因为某种原因科学家们有些害怕实用C++。因为某些原因,你“不得不”使用一个“更容易”的语言来创建原型。当然,你不能使用C++作为一个计算器,而不使用解释的语言,但我看到人们在使用原型语言来计算是遇到困难,并最终没有把它带到一个更快的平台。要点:C++用于科学计算并不难。
WallyMetropolis在 reddit上的评论:
对我来说如果可以使用什么来取代Python的话,看起来Scala是最有希望的候选者。我认为函数式语言是非常适合做数学方面的工作的,它在Java虚拟机上的,所以原型可以在没有太多的开销的情况下成为生产代码,并且可以在任何地方跑起来。Spark是Scala的一个杀手级应用。现在我在原型到运行在一个任意大的数据集之间没有太多的障碍。
rpcope1在 reddit上的评论:
[Scala]在编译时可能是缓慢的,但它更安全,并且比CPython更快(除非使用代码的字节码和调用C / Fortran库),并有很多在Python中没有的概念,如:,隐含的调节器,没有过多废话map/reduce/filter、lambda,等。

打赏

点赞