写点什么

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

评论

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

基于开源引擎打造自主可控服务体系

张亮

大数据 开源 To B业务

👑【Hystrix技术专题】原理和特性介绍

洛神灬殇

Hystrix spring-cloud 熔断器 6月日更

HarmonyOS学习路之开发篇——Page Ability

爱吃土豆丝的打工人

HarmonyOS AbilitySlice路由 AbilitySlice生命周期 AbilitySlice间导航 跨设备迁移

有人融资超6亿,有人营收20亿…这届90后创业者有点猛! | 创业邦2021年30位30岁以下创业新贵重磅发布

创业邦

网络攻防学习笔记 Day45

穿过生命散发芬芳

网络攻防 6月日更

Seata 新特性,APM 支持 SkyWalking

阿里巴巴云原生

运维 云原生

谁是项目的负责人?

escray

学习 极客时间 朱赟的技术管理课 6月日更

源码解析:一文读懂 Kubelet

张晓辉

Kubernetes 源码分析 kubelet

解决权限管控难题,保障数据安全——CloudQuery在证券行业的实践

BinTools图尔兹

数据库 高可用 脱敏 数据库管理 权限管理

尽情阅读,技术进阶,详解mmap的原理

奔着腾讯去

c++ 内存管理 Mmap 虚拟内存 共享内存

小伙伴们在催更Spring系列,于是我写下了这篇注解汇总!!

冰河

spring 程序员 架构师 aop ioc

阿里巴巴新产“Java架构核心宝典”,全是流行技术,限时开放

Java 程序员 架构 面试

从金融街往事到全场景智慧金融未来

白洞计划

阿里P8工作10年,离职时发现只剩这份《Java架构速成》笔记了

Java架构师迁哥

发布60分钟!霸榜Github的阿里面试指导小册,啃透涨薪10k

Java架构师迁哥

HarmonyOS学习路之开发篇——Ability

爱吃土豆丝的打工人

HarmonyOS Ability Ability概述 鸿蒙 Ability

30家企业单笔融资1亿以上,如何让投资人倒追你的项目

创业邦

三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经

Java 程序员 架构 面试

智慧新发展:打造更富动感的智慧园区3D可视化决方案!

一只数据鲸鱼

数据可视化 智慧城市 智慧园区 三维可视化

负载均衡算法之一 - 以 Golang 方式

hedzr

load-balancing weighted round-robin consistent-hashing

git版本升级

阿呆

微服务的简介和技术栈

xcbeyond

微服务 发展史 6月日更

数字经济下的数据库发展以及应用

容光

基于WebRTC的1对1通话实战(一)环境搭建

IT酷盖

音视频 WebRTC

HarmonyOS学习路之开发基础——快速入门(创建另一个页面)

爱吃土豆丝的打工人

HarmonyOS 鸿蒙开发 DevEco Studio 创建新页面 创建另一个页面

如何针对美工与设计师的Maya工具进行版本控制

龙智—DevSecOps解决方案

别闹,那个在加密世界拿着长枪的库币

猫Buboo

区块链 区块链+ 加密资产

Flask-Limiter详细使用说明

行者AI

flask

HarmonyOS学习路之开发基础——快速入门(实现页面跳转)

爱吃土豆丝的打工人

HarmonyOS DevEco 页面跳转 鸿蒙页面跳转

企业云迁移暗藏风险,1人如何扛起性能测试大旗?

TakinTalks稳定性社区

高可用 电商 全链路压测 性能压测 云迁移

网易云信大规模聊天室系统架构解析

网易云信

聊天室 IM

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