写点什么

机器学习与 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:188452

评论

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

开源一夏 | 你不能错过的 Go 强大图形化测试工具

宇宙之一粟

开源 测试框架 testing Go 语言 8月月更

在知识经济的年代,让你学会如何经营好自己的知识

Baklib

“以太坊杀手” Polkadot 何以在一众公链中脱颖而出

One Block Community

区块链 去中心化 跨链技术 波卡生态

真会玩!用手机吹气球你见过不?

岛上码农

flutter ios 前端 安卓开发 8月月更

Spring Cloud Sleuth简述

阿泽🧸

8月月更 Spring Cloud Sleuth

史上最全的Java并发系列之Java中的13个原子操作类

自然

多线程 并发 Java core 8月月更

史上最全的Java并发系列之Java中的并发工具类

自然

多线程 并发 8月月更

知识管理的成熟,需要具备什么条件?

Baklib

深度学习公式推导:从神经元出发

老崔说架构

如何通过FinOps实现企业云成本优化?——信通院《中国FinOps产业发展现状研究报告》解读

星汉未来

云原生 k8s IT FinOps 云成本优化

Spring 全家桶之 Spring Data JPA(二)

小白

8月月更

slb与nat及eip的相关联

肖飞码字

负载均衡 NAT 弹性公网IP

参与openEuler社区不到1年,我成为了社区Maintainer……

openEuler

openEuler 开源社区 社区运营 #开源

基于AQS实现自己的同步工具

自然

多线程 并发 8月月更

每日一R「04」常用的智能指针

Samson

8月月更 ​Rust

浅谈营销型企业站文案应该如何写

石头IT视角

开源一夏 | 拥抱新技术?你需要考虑的方面

微枫Micromaple

开源 经验总结 技术栈 技术分享 8月月更

转转用例平台系列 - 脑图组件2.0

转转技术团队

测试开发 测试用例平台开发

解析 RocketMQ 业务消息——“事务消息”

阿里巴巴云原生

阿里云 RocketMQ 云原生 消息队列

估价器测试工具的实现

转转技术团队

测试工具

实证与虚无,抽象和具象,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang接口(interface)的使用EP08

刘悦的技术博客

Go 编程 教程 Go web 教程分享

软件架构治理 之 如何度量软件架构

码猿外

架构设计 软件架构治理

复盘:如何更好的进行技术面试

老张

面试

SRv6在5G移动网络中的部署方式

穿过生命散发芬芳

8月月更 SRv6

数据结构——栈

工程师日月

8月月更

RocketMQ顺序消息

急需上岸的小谢

8月月更

直播预告 | 如何从 0 到 1 打造敏捷团队?

Authing

TDesign 品牌价值观

TDesign

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