本文转载自:众成翻译
译者:萧暮
链接:http://www.zcfy.cc/article/1861
原文:https://www.quora.com/Why-doesnt-anyone-recommend-JavaScript-Node-js-as-a-language-for-machine-learning-or-data-analysis

我是一个JS程序员(大部分与浏览器相关,部分涉及Node.js),对其他语言完全不了解。

最近我对机器学习和数据科学非常感兴趣,但是所有我读过的关于最佳实践的讨论都未提及JavaScript。

为什么呢?

14个回答。


Matthew Lai, 电子工程师顾问. 从事机器人研发相关的工作。

写于85周前

因为 Node.js 没有为我们已经使用的那些语言提供任何好处。

node.js 是为网络应用而设计的。那些东西对 ML/DA 没什么帮助。

在机器学习领域非常常用的语言,都提供了很有价值的特性:

  • MATLAB - 现成的库,快速矩阵运算,灵活性
  • Python - 容易原型化和对大多数应用来说足够用的库,如 NumPy 和 SciPy
  • C++ - 性能优势

我会学习 Python。这是一门通常在机器学习领域之外也很有用的语言。

想成为一个好的开发者就不能将自己限制于一两种语言之中。每个语言都有其最佳的适用场景,JS 用在 ML/DA 领域显然不太合适。

如果你真的想在机器学习中使用 JS,能做到吗?当然能。但那就是给自己找麻烦。

24.7k 看过 · 查看支持者


Tyler Renelle, Node, React, Machine Learning

修改于10周前

看重库的支持,文档,占有份额等,选 Python;机器学习相关的库(scikit-learn,NumPy,Theano等)在算法上提供了比 Node 更广泛的支持(这一点很重要!);还有性能优势。Python 的库都是用 C/Fortran 写的,在 Theano/Tensorflow 的实例中甚至可以利用 GPU。NumPy 支持矩阵和向量数学运算,使用“单指令流多数据流”(SMID)可以达到 O(1) 的时间复杂度。在 Node 中,需要循环遍历向量,或者嵌套循环遍历矩阵,时间复杂度是 O(n*m)。这些运算的运行频率很高,所以必须进行优化。Python,C++,Matlab 等,它们的库都建立在高性能的运算上。

再要说说“时代精神”。机器学习领域使用的这些语言,尤其是 Python。发展十分迅速,如果你跟不上,就会落后于时代。很多公司都在拼命地开源他们的 Python/C++ 库(如 TensorFlow,CNTK)。网校上大量充斥着机器学习结合 Python 的网络课程。

坦白说 Node 完全无法望其项背,不过我爱 JS;无处不用:后端(Node),前端(React),移动端(React Native)等等。Node 也能够胜任这些任务:机器学习库的作者们可以用 C,LIBSVM,LIBLINEAR 等来写原生 Node 模块(而且异步可能会火)。但他们还没有这么做,Node 要追赶的东西太多了。

应该说明,有很多酷炫的 ML 演示项目都是用 JS 写的(如 brain.js);但是不会应用在大规模 ML 中。所以我建议,用 Node 做你的应用服务,把 ML 相关的需求由通过 RabbitMQ 实现的 Python 微服务来完成。

题外话,在这里我要喷 Python,因为根据你的 JS 经验,我猜你想从事 Web 相关的工作。R 和 Matlab 在学术界更流行 (来源)。

11.8k 看过 · 查看支持者


Bondi French

写于 18 周前

我想是时候再来翻这个问题了。我相信 JS 从未被提过,因为(原谅找不到更好的词)JS 库缺乏市场,有太多的既得利益者更喜欢使用由其他语言(Python,R 等)写的现成的库,而不想总是重复造轮子。

然而如果你去找的话,会发现已经有很多惊人的工作:

最后我想说的是东京大学在机器学习方面的工作,他们用 JS 为机器学习建立了一个完整的集合:MILJS,已经发表了一系列相关的研究论文,自称这是最快的库之一,因为他们开发了一个最快的 JS 库(他们说的,不是我~)用于矩阵计算,利用多核 CPU/GPU,基于 Web-CL 和一个叫 mil-tokyo/sashimi 的分布式计算框架。对于这样的性能声明,我很惊讶他们没有得到更多的关注。

我相信使用 JS 进行 ML 很有潜力,每个人都有浏览器,利用起来!

3.8k 看过 · 查看支持者


Richard Eng, Used Fortran, Tandem TAL, C/C++, C#, Obj-C, Java, Smalltalk, Python, Go
写于 20 周前

原因很简单:有很多很多更好的语言可用。

包括 Java,Python,C++,R,Matlab,Julia。JavaScript 能够统治浏览器开发是因为没有其他选择。JavaScript 在 Node 中能够流行是因为 Node 处理大量事务负载的能力,只要操作没有阻塞。但是像 Go 和 Erlang/Elixir 语言最终将取代 Node,因为他们有更优秀的并行能力。

4.3k 看过 · 查看支持者


John Borsteinas, 衍生品从业者,风险管理,算法培训

写于 36 周前

我通常会用 C/C++...Julia,Python 等去写核心引擎。然而最近我用 Node 做了一些服务器(较少)和客户端的 dashboards 开发,然后我决定用 JS 测试一些算法。结果十分感人。Node 天生支持异步和快速 IO 使得它很“适合”解决需要在网络中并行和异步调用的问题。(但运行开箱即用算法的结果相比其他语言简直让人头疼,不忍直视,什么鬼!)

问题是 JS 不适合用来开发数学库,所以我现在不会用它,直到它能够胜任了 ML 的数字运算部分。

事实上,我能够在 Node 中无缝使用 Julia(它们能够在内存中共享相同的对象而不用任何开销),这样意味着我能用交互模式进行实时监控而几乎没有影响。(我从未将 Node 与其他语言一起用过,所以我不能一概而论)

所以还是让 Node/JS 去管理和监控过程吧,把数值计算留给有更好支持的标准库。

4.3k 看过 · 查看支持者


初次翻译,如有错误,欢迎指正~