写点什么

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

评论

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

IP代理如何助力你的营销业务?如何选择?

Geek_ccdd7f

避免defer陷阱:拆解延迟语句,掌握正确使用方法

伤感汤姆布利柏

有限元分析初学者需要关注哪些问题?

思茂信息

仿真软件 仿真技术 有限元分析 有限元仿真 有限元技术

AppLink上的小鹅通能实现什么操作呢?

RestCloud

APPlink

人工智能 | 开启智慧学习新时代—与AI对话,高效提升学习效率

测吧(北京)科技有限公司

测试

来听B站音乐UP主从容老师讲解GuitarPro和Earmaster

淋雨

Guitar Pro EarMaster 吉他 声乐 视唱

超过5000+企业使用的ETL平台

RestCloud

ETL

亲身体验云原生顶会北美 KubeCon,5个要点和4个 Fun Facts

小猿姐

Kubernetes 云原生 cncf KubeCON

弹性云主机支持多种规格

天翼云开发者社区

云计算 云主机 云平台

三策略,六步骤,Jenkins 迁移到极狐GitLab CI 的终极指南

极狐GitLab

ci DevOps gitlab 持续集成 jenkins

MySQL索引入门

互联网工科生

MySQL 数据库

软件测试/测试开发丨人工智能产品质量保障:挑战与创新

测试人

人工智能 软件测试

详解数据库SQL中的三个语句:DROP、TRUNCATE 、DELETE

华为云开发者联盟

数据库 后端 华为云 华为云GaussDB 华为云开发者联盟

软件测试 |人工智能数据生成,ChatGPT引领测试新风潮

测吧(北京)科技有限公司

测试

计算网络之MSTP协议与VRRP协议

不在线第一只蜗牛

计算机网络 计算机知识 协议解析

你这些网站都不知道,怎么摸好鱼?

秃头小帅oi

前端 低代码 在线 程序选

专家分享——CAE仿真软件学习心得

智造软件

仿真 CAE 仿真软件 CAE软件 altair

聚焦数据安全,神州数码联合多方发布《数据分类分级自动化建设指南》

科技热闻

如何挑选挑选到优质的HTTP代理平台呢?

Geek_ccdd7f

交易所开发:加密货币交易平台开发的见解

区块链软件开发推广运营

交易所开发 dapp开发 区块链开发 链游开发 公链开发

MatrixOne完成与欧拉、麒麟信安的兼容互认

MatrixOrigin

分布式数据库 云原生数据库 MatrixOrigin MatrixOne HTAP数据库

云电脑运行原理分析

天翼云开发者社区

虚拟化 云平台 云电脑

软件测试 |人工智能引领未来学习趋势——ChatGPT智能学习助手

测吧(北京)科技有限公司

测试

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