Javascript和科学处理?

Mik*_*keB 23 javascript scientific-computing data-mining

Matlab,R和Python功能强大,但对于我想做的一些数据挖掘工作来说,要么成本高,要么慢.我正在考虑将Javascript用于 速度,良好的可视化库,以及能够将浏览器用作接口.

我面临的第一个问题是科学编程的明显问题,如何对数据文件进行I/O操作?第二个是客户端还是服务器端?最后一个问题,我可以制作一些真正可移植的东西,即把它全部放在USB上并从中运行吗?

我花了几个星期寻找答案.Server2go似乎解决了客户端/服务器需求,我认为这意味着我可以从客户端的程序中获取数据.Server2go还允许从USB运行.我使用的数据文件通常是XML,似乎有几个javascript的javascript转换器.

然而,在看完之后,我不确定我的方法是否有意义.所以在我进一步提交之前,有关Javascript作为科学​​数据处理的便携式工具的任何建议/想法/指导吗?

Oda*_*ick 11

我不得不同意JavaScript不适合科学处理的评论.但是,您最了解您的要求; 也许你已经找到了有用的库来满足你的需求.请注意,您必须自己实施所有逻辑.没有内置的复杂数字,矩阵或积分或处理......通常程序员时间比机器时间更有价值.就个人而言,我会研究编译语言; 我创建了第一个版本之后,用我最喜欢的任何语言都不够快.

假设JavaScript是要走的路:

数据I/O.

我可以想到三个选择:

使用ajax向服务器发送和接收数据

似乎是您在Server2go中找到的解决方案.它要求您编写服务器后端,但这可以保持非常简单.所有它真正需要能够读取和写入文件作为对客户端应用程序的响应.

使用包含文件I/O的v8的非浏览器实现

例如Node.js的.你可以再避免对服务器的需求,只需使用一个命令行界面,所有的代码将是JavaScript的.除此之外,它大致相当于第一个选项.

使用您要求用户保存或加载的文件API创建文件对象

在我看来,这是最糟糕的选择,因为需要用户交互.它可以避免使用服务器; 您的应用程序可能是一个简单的html文件,它使用ajax请求加载所有数据文件.你不得不Chrome启动一个特殊的开关,以便与Ajax请求file://的协议,如所描述这里

这些选项与文件I/O有关,您无法在JavaScript中执行文件I/O. 这是因为浏览器无法允许任意网页代码做我任意文件/ O; 安全影响将是可怕的.每个选项都描述了一种执行文件I/O的方法.

第一个与为客户端执行文件I/O的服务器通信.

第二种使用"特殊"版本的JavaScript,其条件不同于浏览器的条件,因此安全隐患并不重要.但这意味着你必须在你使用的实际实现中查找文件I/O是如何完成的,这对JavaScript来说并不常见.

第三个要求用户控制文件I/O.

接口

即使您不使用JavaScript进行实际处理,这是迄今为止的共识,也没有什么能阻止您使用浏览器作为可视化的界面或JavaScript库.这是JavaScript擅长的东西.

如果要以交互方式控制数据挖掘工具,需要一个可以控制该工具的服务器.Server2go应该工作,或Node.js中的内置服务器,如果您使用或...如果您不需要交互式控制数据工具; 那就是你首先生成处理过的数据,然后使用file//:协议和JSONP查看服务器可以避免的数据.但是真的; 避免服务器不应该是一个目标.

我不会详细介绍接口问题,因为没有什么特别要说的,而且几乎所有关于javascript的内容都是关于接口的.

有一件事,请使用像Angular.jsKnockout.js这样的声明性数据绑定库.


Ano*_*sse 10

JavaScript速度严重过高.这是一个Web 2.0神话.

让我稍微解释一下这个说法(不要仅仅因为说出你不想听到的内容而向我投票!)

当然,JavaScript V8是一个非常高度优化的VM.它在天真的基准测试中击败了许多其他脚本语言.

但是,它是一种非常有限的范围语言.它适用于网络的"ADHS世界".这是最好的努力,但它可能会失败,你对完成或按时完成的事情几乎没有保证.

考虑例如MongoDB.起初它似乎很好,速度快,并提供了很多.直到你看到例如MapReduce只是单线程,因此非常慢.并非所有的黄金都闪闪发光!

现在看一下数据挖掘相关的库,比如BLAS.基本线性代数,数学运算等.英特尔和AMD等所有CPU制造商都为其CPU 提供优化版本.这是一项优化,需要详细了解各个CPU,超出了我们当前编译器的能力.这些库包含针对各种CPU的优化代码路径,它们基本上都在做同样的事情.对于这些操作,使用BLAS等优化库可以轻松实现5-20倍的加速; 同时,通常在O(n ^ 2)或O(n ^ 3)中的矩阵运算将主导您的整个运行时.

因此,一个好的数据挖掘语言将让您一路走到机器代码!

Pythons SciPy和R在这里是不错的选择.它们内部具有优化的库并且易于访问,但同时允许以更简单的语言执行包装器.

看看这个编程语言基准:

http://benchmarksgame.alioth.debian.org/u32/which-programs-are-fastest.html

纯JavaScript具有很高的方差,表明它可以快速完成某些事情(主要是正则表达式!),其他更慢.它可以明显胜过PHP,但它会被C和Java明显击败.

多线程对于现代数据挖掘也很重要.今天很少有大型系统拥有单核,您确实希望使用所有核心.因此,您需要具有一组强大的多线程操作的库和编程语言.这实际上是Fortran和C在这里失去人气的原因.其他语言如Java在这里要好得多.