写点什么

机器学习与 JavaScript(一)

  • 2017-07-03
  • 本文字数:3149 字

    阅读完需:约 10 分钟

你应该觉得基于 JavaScript 的机器学习不简单吧。

JAVASCRIPT?!我难道不应该用 Python 么?我难道要用 JavaScript 去做如此复杂的运算?难道我不应该使用 Python 或者 R 语言么?scikit-learn 算法库会不会不能在 JavaScript 中使用?简单来说:基于 JavaScript 的机器学习完全没有问题。

详细来讲,基于 JavaScript 的机器学习是有可能的,并且我总是很吃惊为什么开发者们没有给予它应有的关注。就 scikit-learn 算法库而言,JavaScript 开发者已经开发了一系列实现该算法的库,一会儿就会用到一个库。接下来会先讲一点机器学习的知识,然后就放松心情一起来看代码吧。

据 Arthur Samuel 所讲,机器学习就是在不对其进行具体编程的情况下,使计算机拥有学习的能力。换句话说,它在我们不操作计算机的情况下,却能拥有自我学习的能力,并能执行正确的指令。并且谷歌公司已经将策略从移动优先转变为 AI 优先很长一段时间了。

为什么在机器学习领域没有提到 JavaScript 呢?

  1. JavaScript 很慢。(完全错误的观念 !?! )
  2. JavaScript 很难进行矩阵操作。(但是有很多库的,比如 math.js )
  3. JavaScript 仅仅被认为是用来做 web 开发的。(Node.js默默的笑了)
  4. 机器学习中很多库都是基于 Python 开发的。(那是因为 JavaScript 开发者并没有在场)

现在已经有很多的 JavaScript 库了,它们已经预定义了机器学习算法,比如:线性回归、支持向量机、朴素贝叶斯算法等,以下列出了几个库:

  1. brain.js (神经网络)
  2. Synaptic (神经网络)
  3. Natural (自然语言处理)
  4. ConvNetJS (卷积神经网络)
  5. mljs (一种具有多个函数方法的子库)

我将使用 mljs 的回归库来执行线性回归模型的分析。全部代码都在 Github 上: machine-learning-with-js

第一步. 安装依赖的库

$ yarn add ml-regression csvtojson或者你更喜欢 npm:

$ npm install ml-regression csvtojsonml-regression 所做的事正如它的名字那样,机器学习线性回归库。

csvtojson 是在 node.js 环境中的一个 cvs 数据解析器,它可以在你加载完 cvs 数据后将其快速的转换为 JSON。

第二步. 初始化依赖库并加载数据

首先从这里下载数据文件,并将数据文件放在你的工程目录中。

假设你已经初始化了一个空的 npm 工程,打开 index.js 文件,并输入以下代码:(你可以直接复制 / 粘贴,但为了能够更好的理解它,建议你能亲自输入这段代码)

复制代码
const ml = require('ml-regression');
const csv = require('csvtojson');
const SLR = ml.SLR; // 简单线性回归
const csvFilePath = 'advertising.csv'; // 数据文件
let csvData = [], // 已解析的数据
X = [], // 输入
y = []; // 输出
let regressionModel;

我把这个文件放在了项目的根目录下,因此如果你放在了别的目录下,请同时更改上述代码中的 csvFilePath 变量。

这样的代码看起来相当整洁,不是么?

接下来使用 csvtojson 库的 fromFile 方法加载数据文件。

复制代码
csv()
.fromFile(csvFilePath)
.on('json', (jsonObj) => {
csvData.push(jsonObj);
})
.on('done', () => {
dressData(); //JSON 对象中获取数据点
performRegression();
});

第三步. 将数据加以装饰,以准备开始执行

保存在 csvData 变量中的 JSON 对象已经准备好了,同时还分别需要一个数组,用来存储输入点数据和输出点数据。然后将通过 dressData 函数来运行数据,且 dressData 函数将会计算出 X 和 Y 变量。

复制代码
function dressData() {
/**
* 一个数据对象应该这样:
* {
* TV: "10",
* Radio: "100",
* Newspaper: "20",
* "Sales": "1000"
* }
*
* 因此,在添加数据点的同时,
* 我们需要将 String 类型的值解析为 Float 类型。
*/
csvData.forEach((row) => {
X.push(f(row.Radio));
y.push(f(row.Sales));
});
}
function f(s) {
return parseFloat(s);
}

第四步. 训练模型,并开始进行预测

现在数据已经装饰好了,是时候来训练模型了。

为了实现这一目标,我们需要一个 performRegression 函数:

复制代码
function performRegression() {
regressionModel = new SLR(X, y); // 基于训练数据来训练模型
console.log(regressionModel.toString(3));
predictOutput();
}

regressionModel 有一个 toString 方法,它所接收的参数代表输出值浮点数的精度。

predictOutput 方法能够接收所输入的值,并且向终端输出所预测的值。

以下就是这个函数的代码:(这里使用了 node.js 的 readline 模块)

复制代码
function predictOutput() {
rl.question('Enter input X for prediction (Press CTRL+C to exit) : ', (answer) => {
console.log(`At X = ${answer}, y = ${regressionModel.predict(parseFloat(answer))}`);
predictOutput();
});
}

以下代码读取了用户的输入值:

复制代码
const readline = require('readline'); // 同时预测用户的输入值
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});

第五步. 恭喜你!做到了。

如果你跟着我一步一步的做,现在你的 index.js 文件应该是这样子的:

复制代码
const ml = require('ml-regression');
const csv = require('csvtojson');
const SLR = ml.SLR; // 简单线性回归
const csvFilePath = 'advertising.csv'; // 数据
let csvData = [], // 已解析的数据
X = [], // 输入
y = []; // 输出
let regressionModel;
const readline = require('readline'); // 同时预测用户的输入值
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
csv()
.fromFile(csvFilePath)
.on('json', (jsonObj) => {
csvData.push(jsonObj);
})
.on('done', () => {
dressData(); // 从 JSON 对象中获取数据点
performRegression();
});
function performRegression() {
regressionModel = new SLR(X, y); // 基于训练数据来训练模型
console.log(regressionModel.toString(3));
predictOutput();
}
function dressData() {
/**
* 一个数据对象应该这样:
* {
* TV: "10",
* Radio: "100",
* Newspaper: "20",
* "Sales": "1000"
* }
*
* 因此,在添加数据点的同时,
* 我们需要将 String 类型的值解析为 Float 类型。
*/
csvData.forEach((row) => {
X.push(f(row.Radio));
y.push(f(row.Sales));
});
}
function f(s) {
return parseFloat(s);
}
function predictOutput() {
rl.question('Enter input X for prediction (Press CTRL+C to exit) : ', (answer) => {
console.log(`At X = ${answer}, y = ${regressionModel.predict(parseFloat(answer))}`);
predictOutput();
});
}

打开终端,输入并运行 node index.js,它将会输出如下所示内容:

复制代码
$ node index.js
f(x) = 0.202 * x + 9.31
Enter input X for prediction (Press CTRL+C to exit) : 151.5
At X = 151.5, y = 39.98974927911285
Enter input X for prediction (Press CTRL+C to exit) :

恭喜你!刚刚用 JavaScript 训练了你的第一个线性回归模型。(你有注意到它的速度么?)

PS: 我将使用 ml 和其他的库(上面所列出的那些)在各种数据集上执行目前比较流行的机器学习算法。请时刻关注我的动态,获取最新的机器学习教程。

感谢你的阅读!如果你喜欢这篇文章的话,请为我点赞,以让别人知道 JavaScript 是多么的强大,以及为什么在机器学习领域中 JavaScript 不应该落后。

查看英文原文: Machine Learning with JavaScript : Part 1


感谢薛命灯对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-07-03 17:188654

评论

发布
暂无评论
发现更多内容

Ansible AD-Hoc

耳东@Erdong

ansible 5月日更

anyRTC 六周年 打造全网最低音视频价格

anyRTC开发者

音视频 WebRTC RTC sdk

iMazing比iTunes好用在哪些地方

懒得勤快

揭秘 Amazon Go 无人商店是如何炼成的!

亚马逊云科技 (Amazon Web Services)

CampusBulider(模模搭)学习笔记5:创建自定义建筑

ThingJS数字孪生引擎

大前端 可视化 3D 3D可视化 数字孪生

人证一体机产品设计

lenka

5月日更

Amazon Glue 版本 2.0 将作业启动时间缩短了 10 倍,现已全面开放!

亚马逊云科技 (Amazon Web Services)

限流与Guava RateLimiter原理解析

千珏

Java 微服务 限流算法 Guava 令牌桶

智慧党建三维云展厅可视化

一只数据鲸鱼

数据可视化 智慧党建 三维可视化

Gradle学习笔记

ES_her0

5月日更

编程思考路径2条

顿晓

5月日更 思考路径

【LeetCode】子数组异或查询Java题解

Albert

算法 LeetCode 5月日更

关于组件,你真的了解么?

架构精进之路

组件化 5月日更

源码解析之Seata项目中的分布式ID生成算法

Coder的技术之路

分布式 分布式ID

Nginx负载均衡配置误区

运维研习社

nginx 负载均衡 5月日更

网络协议之HTTP:HTTP 1.1与HTTP 2

程序员架构进阶

HTTP2.0 28天写作 HTTP协议 5月日更

再学习一个 Golang 专栏

escray

学习 极客时间 Go 语言 5月日更

NumPy之:理解广播

程序那些事

Python Numpy 程序那些事

流量变现业务概论——Linkedmall流量变现业务初步分析及系统设计概要

关贺宇

如何高效地存储与检索大规模的图谱数据?

华为云开发者联盟

存储 知识图谱 检索 图结构 表结构

Amazon Route 53 Resolver 落地中国区,轻松玩转私有域名互访不是梦!| 新服务上线

亚马逊云科技 (Amazon Web Services)

怎么进大厂?166位Java工程师的大厂面试经验分享

北游学Java

Java 面试 大厂

你认识镜子里的那个自己吗?

小天同学

原则 认知 5月日更

将自媒体玩得风生水起的不一定是前总统,还有可能是艺术家

zhoo299

艺术 自媒体 5月日更

“云演唱会”也有仪式感!能检票、可转赠,爱奇艺“云票”如何重构线上购票逻辑

爱奇艺技术产品团队

HuskyLens人工智能摄像头

不脱发的程序猿

人工智能 智能硬件 AIOT HuskyLens 人工智能摄像头

学习笔记:02 | 第一个程序:教你输出彩色的文字

Nydia

学习

Windows自带的功能这么好用,还装什么第三方软件?

彭宏豪95

windows 5月日更

嵌入式程序调用函数的内部过程和机制

不脱发的程序猿

单片机 嵌入式程序 嵌入式设计

华为云PB级数据库GaussDB(for Redis)揭秘第十期:GaussDB(for Redis)迁移系列(上)

华为云开发者联盟

数据仓库 华为云 数据迁移 GaussDB(for Redis) PB级数据库

STM32电源框图解析(VDD、VSS、VDDA、VSSA、VREF+、VREF-、VBAT等的区别)

不脱发的程序猿

嵌入式 stm32 单片机 电源框图解析

机器学习与JavaScript(一)_JavaScript_Abhishek Soni_InfoQ精选文章