当前位置:  开发笔记 > 编程语言 > 正文

为什么机器学习的框架都偏向于Python?

Python有哪些特性让科学计算的开发者们这么喜欢?
Python有哪些特性让科学计算的开发者们这么喜欢?

回复内容:

总结:好写、支持全面、好调、速度不慢。

1. Python是解释语言,这让写程序方便不只一点。举例来说,在C等编译语言里写一个矩阵乘法,需要自己分配操作数(矩阵)的内存、分配结果的内存、手动对BLAS接口调用gemm、最后如果没用smart pointer还得手动回收内存空间。Python几乎就是import numpy; numpy.dot两句话的事。
Update (2015-5-7): 当然现在很多面向C/C++库已经支持托管的内存管理了,这也让开发过程容易了很多,但解释语言仍然有天生的优势——不需要编译时间。这对机器学习这种需要大量prototyping和迭代的研究方向是非常有益工作效率的。

2. Python的开发生态成熟,有很多非常有用的库可以用。除了上面说到的NumPy,还有SciPy、NLTK、os(自带)等等不一而足。Python灵活的语法还使得包括文本操作、list/dict comprehension等非常实用的功能非常容易高效实现(编写和运行效率都高),配合lambda等使用更是方便。这也是Python良性生态背后的一大原因。相比而言,Lua虽然也是解释语言,甚至有LuaJIT这种神器加持,但其本身很难做到Python这样,一是因为有Python这个前辈占领着市场份额,另一个也因为它本身种种反常识的设计(比如全局变量)。不过借着Lua-Python bridge和Torch的东风,Lua似乎也在寄生兴起。

3. 写程序方便对做机器学习的人很重要。因为经常需要对模型进行各种各样的修改,这在编译语言里很可能是牵一发而动全身的事情,Python里通常可以用很少的时间实现。

4. Python的效率不差。解释语言的发展已经大大超过许多人的想象。很多比如list comprehension的语法糖都是贴近内核实现的。除了JIT[1]之外,还有Cython可以大幅增加运行效率。最后,得益于Python对C的接口,很多像gnumpy, theano这样高效、Python接口友好的库可以加速程序的运行,在强大团队的支撑下,这些库的效率可能比一个不熟练的程序员用C写一个月调优的效率还要高。

[1] 原生Python是不自带JIT的,想用JIT的同学可以看看PyPy和Numba。(多谢评论中 @刘慎修同学指出) python 的性能差不用来洗白,确实差,在web框架中 python 的性能相对于 C/C++ Java大概会差十几到几十倍。

然而它仍然可以流行是它对解决问题非常友好。

这原因其中包括 python 本身的易用优势和强大的工具库储备。

比如:

做安全的想发个探测包,requests 能完全封装好协议栈的操作,使用者只关心真正需要关心的发给谁发什么数据,这实际上是非常高效的。

而文本操作也同样省去了许多不需要重复做的事情。

这一点的诱惑非常大的,虽然技多不压身,但做研究做探索,时间精力真的很宝贵,python 节约的时间用来思考真正该要解决的问题才是大家需要的。

说到底编程语言只是工具,所谓精通某一门编程语言,是对工具的使用的熟练,懂得处理什么样的问题是另外一码事。

而机器学习的研究就是另外一码事,对这码事来说,用什么不重要,什么能节约掉不必要的精力开支就用什么,因为还有更多更重要的事情要做,纠结于编程语言底层如何操作不是这里要关心的,没必要也不应该。 Matlab是进行研究机器相关研究的最好语言,几乎没有之一。然而,价格不菲。于是,学者们将视线转到了Python。

有个学者是做机器学习的,但不是计算机专业出身。对于他来说,最直接的需求就是,将自己的idea从公式转化到计算机语言,进行运行即可。这一次转化,中间所需要做的额外精力越少越好

那么首先,在算法实现的过程中,遵循程序语言的规则和避免程序语言的陷阱是需要耗费精力的:Python语言本身的设计,可以帮助用户避开数量不少的陷阱,无需考虑申明变量,释放内存这些非计算专业学者所认为的“琐事”。

其次,从数学符号转化到计算机语言这本身,也是需要耗费精力的。如果能提供给研究人员一种错觉:“写程序,就是将公式以另一种语言再写一遍即可”,是比较完美的。Python所能提供的这种错觉,相对于其他语言,比较偏高。主要依靠Python本身的特色和一些开源的算法库。首先,Vector提供了吧,学者理解这个泛型几乎不需要眨眼吧。然后,全称量词\forall 什么的,一个for in也能解释,虽然有点怪怪的,但也能接受吧。最后,一大波库袭来,SciPy、Numpy等等。让写程序和写公式一样酸爽。

到这里,这个学者有点坐不住了。觉得这个还行,先看看价格,你猜怎么着,免费!!!!学者立即一拍大腿,就她了。这时候,突然一道亮光闪过,Python女神出现在他的面前:“感谢您选择Python,我们还有超级大礼包相送哦”

“首先,您发表的论文得有个图吧,来来来,这里有个Matplotlib拿去。画出来的图特别的萌萌哒。”

“您平时做研究还要做个笔记什么的吧,来来来,这里有个ipython notebook拿去,做笔记也萌萌哒。哦,忘了告诉你了。稍微转化一下,可以用作slideshow。这样,你去开会的时候,做presentation 也萌萌哒”

“还有哦,我们还提供网络蜘蛛,lambda函数式编程。只要您需要,也会提供哦,免费的哦!!”

“希望您使用愉快!”

这时候,这个学者厚重的眼镜片下,充满了泪水。

----
以上,根据自己的理解回答了一下。可能有很多不严谨的地方,望海涵。本来想正儿八经的回答一下,结果答到后面就越来越不正经了。 python大法好,这是很多机器学习程序猿的共识,楼上都说了在语言特性方面的有点。在这里补充一下python和matlab对于深度学习的支持。
Theano:这是一个基于python的开源代码库,主要的优势(相比于matlab的各种工具箱)在于可以利用GPU加速。相比较而言,matlab的GPU支持不够,这就限制了其在深度学习方面的应用前景。

Caffe:目前最火的深度学习框架,用C++写的,但提供了python和matlab的接口,虽然提供了这些接口,但用过的人应该都知道,matlab接口真的一般,相比之下python接口做得很好,提供了各种操作,这也使得大部分人都在用python的接口---尤其是在hypercolumn的概念出来以后。 其实原因是,搞机器学习的,大部分都不会写代码 其实Python用着比较好的也就那么几个, 无非是好学,生产力高, 适合搞科研,做原型。

你看博士最乐意用的matlab不也是这样吗。 语言特性的话,就两点。
1、Python是解释性语言,入门比较简单,语法比较优美。
2、用Python开发比较快。要知道机器学习的开发,关键在于有个想法之后立马用代码去实现以验证算法的可操作性和优越性。而C++等效率类语言开发慢,且代码维护难。
-----------------------------------------------------------------------------------------------------------------------------
我个人觉得选择python最重要的反倒不是其语言特性。而是因为Python的社区比较perse。而且现在科学计算这块是Python的大方向。
Python有众多例如scikit-learn这样成熟的机器学习包,,并且还有Numpy、Scipy、Pandas、Matplotlib以及Numba、Pypy等可以大幅提神科学计算速度的包。。方便开发人员快速开发机器学习算法。并且在遇到问题的时候,还可以寻求Python社区里面大牛的帮主。
-----------------------------------------------------------------------------------------------------------------------------
最后一句,Python大法好。
------------------------------------------------------------------------------------------------------------------------------
真的是最后一句了,人生苦短,我用Python。 只举一个例子,scikit-learn中调用svm进行预测:
from sklearn import svm
# 进行训练
clf = svm.SVC()
clf.fit(train_x, train_y)
# 对新的数据进行预测
clf.predict(new_x)

还有比这个更傻瓜化的机器学习包吗? Python适合做一些简单的数据预处理的工作,或者一些只用跑一两次的简单的job,但是做核心数据计算跟C++的效率差太多 (Cython可以稍微提速一下,但是中间的坑很多,要想把Cython程序写快不比直接写C++容易)。

对于ML来说,主程序至少要跑几十次,甚至成百上千次,写程序省下的一点点方便,是跑程序调参数等结果时留下的泪。。。。

随着C++11/14的新特征的引用,写起来也不比python麻烦。做多线程并行也比python要方便很多。 以前上课时在Matlab和Python写Machine Learning的作业,第一次作业写个SVM,爽得飞起。之前自己用C写一个Jacobian,恶心死了。

再说画图,Matlab和Matplotlib多简单啊。用C++?先装个Qt,然后用qglviewer调用opengl里头画吧您。

我就不说blas和lapack那些东西有多麻烦了,也不说csparse那玩意儿了,喝喝……
推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有