写点什么

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

评论

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

AI GEO领域发展机遇大

跑一跑

geoai

限行提醒小程序介绍

微擎应用市场

企业如何选择适合自己的私有化视频会议产品?

BeeWorks

即时通讯 IM 私有化部署

AI技术的英语背诵APP开发

北京木奇科技有限公司

AI技术开发 软件外包公司 AI英语学习

一次缓存引发的文件系统数据不一致问题排查与深度解析

阿里技术

缓存 问题 故障排查 解析

融云:当年搞出了「飞信」的师傅,如今竟扛着 200 多个国家的聊天、弹幕和日常?

融云 RongCloud

区块链U卡APP的的开发过程

北京木奇移动技术有限公司

区块链开发 软件外包公司 web3开发

海外舆情监测系统的价值与玩法

沃观Wovision

跨境贸易 出海 舆情监测系统 海外舆情监测

GreatSQL分页查询优化案例实战

GreatSQL

零售业将在 2025 年引领 RFID 革命

斯科信息

斯科信息 RFID技术 RFID门禁系统 RFID收银设备

猜灯谜赢大奖系统介绍

微擎应用市场

什么是子域名劫持?子域名劫持如何防御?

防火墙后吃泡面

如何轻松掌握三维模型层次结构,快来试试结构树功能!

在路上

cad cad看图 CAD看图王

数据湖变“数据沼泽”?TDengine IDMP 让 AI 秒懂数据

TDengine

tdengine 时序数据库 工业数据

定档!对话式 AI 和 Voice Agent Builder 的年度春晚,来 Convo AI & RTE2025 一探究竟

声网

实测有效|用 SeaTunnel 免费实现 MySQL→Oracle 实时同步,步骤超细

白鲸开源

MySQL oracle 大数据 数据同步 Apache SeaTunnel

融云十周年:于时代的「十字路口」,相信持续精进的力量

融云 RongCloud

CST软件如何确定Floquet模数和背景距离

思茂信息

cst cst仿真软件 CST软件 CST Studio Suite

ElevenLabs 估值翻倍至 66 亿美元;B 站开源 IndexTTS2;通义推出 Qwen3-ASR-Flash丨日报

声网

政务预约系统介绍

微擎应用市场

AI在英语培训中的应用

北京木奇科技有限公司

软件外包公司 AI英语学习 AI英语

第三届人工智能与自动化控制国际学术会议(AIAC 2025)

搞科研的小刘

人工智能 自动化 学术会议

大数据-93 SparkSQL 全面解析:SQL + 分布式计算的完美结合

武子康

Java 大数据 flink spark 分布式

一行代码引发 12G 内存 5 分钟爆仓!SeaTunnel Kafka 连接器"内存溢出"元凶抓到了

白鲸开源

kafka 开源 内存 数据同步 Apache SeaTunnel

【浪潮海岳inDatax数据中台专栏】数据门户-灵活多样的数据共享方案

inBuilder低代码平台

文心快码升级至3.5S版本,强化多智能体自协同能力

Comate编码助手

AI辅助编程 AI 编程 文心快码 文心快码Zulu

为时序数据库 IoTDB 底层架构“保驾护航”,来听听新晋 Committer 的贡献心路!

Apache IoTDB

KaiwuDB X 智慧船舶:一库多赢,破解船舶系统数据高并发难题

KaiwuDB

数据库

如何在 Unity3D 中实现无缝滚动动画?

北桥苏

喜报!白鲸开源 CEO 荣登「2025 中国数智化转型升级先锋人物」榜

白鲸开源

大数据 科技 DataOps 白鲸开源

恒拓高科BeeWorks亮相鸿蒙 HEC 生态大会,重构数字化协作免费新体验

BeeWorks

即时通讯 IM 私有化部署

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