25

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

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

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

但是,在环顾四周之后,我不确定我的方法是否有意义。所以在我进一步承诺之前,关于 Javascript 作为科学数据处理的便携式工具的任何建议/想法/指导?

4

3 回答 3

12

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

假设 JavaScript 是要走的路:

数据输入/输出

我可以想到三个选项:

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

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

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

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

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

在我看来,这是最糟糕的选择,因为需要用户交互。它将避免对服务器的需要;您的应用程序可以是一个简单的 html 文件,它使用 ajax 请求加载所有数据文件。您必须使用特殊开关启动 Chrome 以允许使用file://协议的 ajax 请求,如此处所述

这些选项与文件 I/O 相关,您不能在 JavaScript 中进行文件 I/O。这是因为浏览器不能允许任意 Web 代码进行任意文件 I/O;安全影响将是可怕的。每个选项都描述了一种进行文件 I/O 的方法。

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

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

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

界面

即使您不使用 JavaScript 进行实际处理(到目前为止这是共识),也没有什么能阻止您使用浏览器作为界面或 JavaScript 库进行可视化。这是 JavaScript 擅长的。

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

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

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

于 2012-07-25T14:57:03.097 回答
11

JavaScript 速度被严重高估了。这是一个 Web 2.0 的神话。

让我稍微解释一下这个说法(不要因为我说了你不想听的话而对我投反对票!)

当然,JavaScript V8 是一个高度优化的虚拟机。它确实在幼稚的基准测试中击败了许多其他脚本语言。

但是,它是一种范围非常有限的语言。它适用于网络的“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)在这里要好得多。

于 2012-07-26T05:54:46.973 回答
4

虽然这个讨论有点老了,而且无论如何我都不是 Javascript 专家,但我发现上述论点对于没有处理速度或高级数学运算的能力是值得怀疑的。WebGL 是一个用于渲染高级 2D 和 3D 图形的 Javascipt API,它严重依赖高级数学运算。我相信从技术角度来看这些功能是存在的,但是缺少的是处理统计分析、自然语言处理和数据挖掘中包含的其他预测分析的优秀库。

WebGL 基于 openGL,后者又使用BLAS 之类的库(此处为库信息)。

node.js、w8 等先进技术使其在技术上成为可能。缺少的是我们可以在 R 和 Scilab 中找到的库来执行相同的操作。

于 2013-12-18T13:56:19.373 回答