Javascript 机器学习的四个层次
简介: Atwood定律说,凡是可以用Javascript实现的应用,最终都会用Javascript实现掉。作为最热门的机器学习领域,服务端是Python的主场,但是到了手机端呢?Android和iOS里默认都没有Python。但是有浏览器的地方就有js,现在还有个新场景 - 小程序。
来源: Alibaba F2E
作者:旭伦
Atwood定律说,凡是可以用Javascript实现的应用,最终都会用Javascript实现掉。作为最热门的机器学习领域,服务端是Python的主场,但是到了手机端呢?Android和iOS里默认都没有Python。但是有浏览器的地方就有js,现在还有个新场景 - 小程序。
除此之外,为了可以在不联网情况下进行训练的,也有支持本地框架比如React Native的。
可以说,只要有前端的地方,就有机器学习的框架在。
js唯一的问题在于,变化太快,每年都有很多新库出现,但是也有不少老的库宣布不维护了。但是,万变不离其宗,工具本身虽然经常有变化,但是它们的类型是非常稳定的。
选择机器学习工具的方法论
我们要写机器学习算法,需要什么样的工具呢?
机器学习工具可以分为以下四个层次:

层次一:直接服务于具体领域的框架
首先我们需要直接服务于具体领域的框架,比如处理CV的,NLP的,推荐算法之类的。
比如nlp.js,上一个版本发布在2020年10月。nlp.js的代码写起来是这样的:
const { NlpManager } = require('node-nlp');
const manager = new NlpManager({ languages: ['en'], forceNER: true });
// Adds the utterances and intents for the NLP
manager.addDocument('en', 'goodbye for now', 'greetings.bye');
manager.addDocument('en', 'bye bye take care', 'greetings.bye');
manager.addDocument('en', 'okay see you later', 'greetings.bye');
manager.addDocument('en', 'bye for now', 'greetings.bye');
manager.addDocument('en', 'i must go', 'greetings.bye');
manager.addDocument('en', 'hello', 'greetings.hello');
manager.addDocument('en', 'hi', 'greetings.hello');
manager.addDocument('en', 'howdy', 'greetings.hello');
// Train also the NLG
manager.addAnswer('en', 'greetings.bye', 'Till next time');
manager.addAnswer('en', 'greetings.bye', 'see you soon!');
manager.addAnswer('en', 'greetings.hello', 'Hey there!');
manager.addAnswer('en', 'greetings.hello', 'Greetings!');
// Train and save the model.
(async() => {
await manager.train();
manager.save();
const response = await manager.process('en', 'I should go now');
console.log(response);
})();

运行起来很简单,装个库就好:
npm install node-nlp

训练的速度也很快:
Epoch 1 loss 0.4629286907733636 time 1ms
Epoch 2 loss 0.2818764774939686 time 0ms
Epoch 3 loss 0.16872372018062168 time 0ms
Epoch 4 loss 0.11241683507408215 time 0ms
...
Epoch 31 loss 0.00004645272306535786 time 0ms

输出的结果类似这样:
{
locale: 'en',
utterance: 'I should go now',
settings: undefined,
languageGuessed: false,
localeIso2: 'en',
language: 'English',
nluAnswer: {
classifications: [ [Object] ],
entities: undefined,
explanation: undefined
},
classifications: [ { intent: 'greetings.bye', score: 1 } ],
intent: 'greetings.bye',
score: 1,
domain: 'default',
sourceEntities: [
{
start: 12,
end: 14,
resolution: [Object],
text: 'now',
typeName: 'datetimeV2.datetime'
}
],
entities: [
{
start: 12,
end: 14,
len: 3,
accuracy: 0.95,
sourceText: 'now',
utteranceText: 'now',
entity: 'datetime',
resolution: [Object]
}
],
answers: [
{ answer: 'Till next time', opts: undefined },
{ answer: 'see you soon!', opts: undefined }
],
answer: 'see you soon!',
actions: [],
sentiment: {
score: 0.5,
numWords: 4,
numHits: 1,
average: 0.125,
type: 'senticon',
locale: 'en',
vote: 'positive'
}
}

层次二:深度学习框架
第二是我们的核心内容,深度学习框架。
说到Javascript深度学习,占统治地位的仍然是Tensorflow.js,我们来看个经典的强化学习的例子:
我们再看另一个大厂微软的例子,支持webGL和wasm,基于浏览器不容易:
另外需要强调的是,用于前端的框架并不是简单的把native或者python框架移植过来的,比如说它要处理兼容性的问题:
很多同学都对Tensorflow有一定了解,我们就手写一个网页,然后在其中调tf的API就好:
<!DOCTYPE html>
<html>
<head>
<meta encoding="UTF-8"/>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@3.0.0/dist/tf.min.js"></script>
</head>
<body>
<div id="tf-display"></div>
<script>
let a = tf.tensor1d([1.0]);
let d1 = document.getElementById("tf-display");
d1.innerText = a;
</script>
</body>
</html>

层次三:机器学习框架
第三是机器学习的框架。光了解深度学习还不够,传统的机器学习在更贴近业务的时候,可能效果更好,还节省算力资源。比如可以使用mljs库,地址在:https://github.com/mljs/ml
比如我们想做个k-means聚类,可以使用mljs框架的ml-kmeans库:
const kmeans = require('ml-kmeans');
let data = [[1, 1, 1], [1, 2, 1], [-1, -1, -1], [-1, -1, -1.5]];
let centers = [[1, 2, 1], [-1, -1, -1]];
let ans = kmeans(data, 2, { initialization: centers });
console.log(ans);

装个包就可以玩了:
npm i ml-kmeans

运行结果如下:
KMeansResult {
clusters: [ 0, 0, 1, 1 ],
centroids: [
{ centroid: [Array], error: 0.25, size: 2 },
{ centroid: [Array], error: 0.0625, size: 2 }
],
converged: true,
iterations: 2,
[Symbol(distance)]: [Function: squaredEuclidean]
}

我们也可以直接在网页中使用,比如我们写个K近邻的例子:
<!DOCTYPE html>
<html>
<head>
<meta encoding="UTF-8" />
<script src="https://www.lactame.com/lib/ml/4.0.0/ml.min.js"></script>
</head>
<body>
<div id="ml-display"></div>
<script>
const train_dataset = [
[0, 0, 0],
[0, 1, 1],
[1, 1, 0],
[2, 2, 2],
[1, 2, 2],
[2, 1, 2],
];
const train_labels = [0, 0, 0, 1, 1, 1];
let knn = new ML.KNN(train_dataset, train_labels, { k: 2 }); // consider 2 nearest neighbors
const test_dataset = [
[0.9, 0.9, 0.9],
[1.1, 1.1, 1.1],
[1.1, 1.1, 1.2],
[1.2, 1.2, 1.2],
];
let ans = knn.predict(test_dataset);
let d1 = document.getElementById("ml-display");
d1.innerText = ans;
</script>
</body>
</html>

最后我们再来个决策树的例子,采用mljs自带的Iris数据集。需要通过npm安装下ml-dataset-iris和ml-cart:
const irisDataset = require('ml-dataset-iris');
const DecisionTreeClassifier = require('ml-cart');
const trainingSet = irisDataset.getNumbers();
const predictions = irisDataset
.getClasses()
.map((elem) => irisDataset.getDistinctClasses().indexOf(elem));
const options = {
gainFunction: 'gini',
maxDepth: 10,
minNumSamples: 3,
};
const classifier = new DecisionTreeClassifier.DecisionTreeClassifier(options);
classifier.train(trainingSet, predictions);
const result = classifier.predict(trainingSet);
console.log(result);

输出结果如下:
[
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1,
... 50 more items
]

层次四:数学和统计库
第四个层次是数学和统计库。做统计和数学计算,很多时候才是理解业务的最好手段。这个时候我们也不能空手上,也需要工具。
这方面的代表库有stdlib: https://stdlib.io/虽然它名字和实际都是标准库,但是为了数学和统计提供了很丰富的内容,比如150多个数学函数和35种统计分布。
我们先安装一下做后面的实验:
npm install @stdlib/stdlib

比如各种数学函数:
再比如各种随机分布:
const Normal = require( '@stdlib/stats/base/dists/normal' ).Normal;
let dist1 = new Normal( 0, 1 );
console.log(dist1);
let m1 = dist1.mean;
console.log(m1);
let v1 = dist1.variance;
console.log(v1);

构造Normal时的两个参数是均值和方差。
输出如下:
Normal { mu: [Getter/Setter], sigma: [Getter/Setter] }
0
1

这个无良的标准库竟然还支持50多种数据集,看个小例子,美国州首府的数据集:
const capitals = require( '@stdlib/datasets/us-states-capitals' );
const data_c = capitals();
console.log(data_c);

输出结果如下:
[
'Montgomery', 'Juneau', 'Phoenix',
'Little Rock', 'Sacramento', 'Denver',
'Hartford', 'Dover', 'Tallahassee',
'Atlanta', 'Honolulu', 'Boise',
'Springfield', 'Indianapolis', 'Des Moines',
'Topeka', 'Frankfort', 'Baton Rouge',
'Augusta', 'Annapolis', 'Boston',
'Lansing', 'Saint Paul', 'Jackson',
'Jefferson City', 'Helena', 'Lincoln',
'Carson City', 'Concord', 'Trenton',
'Santa Fe', 'Albany', 'Raleigh',
'Bismarck', 'Columbus', 'Oklahoma City',
'Salem', 'Harrisburg', 'Providence',
'Columbia', 'Pierre', 'Nashville',
'Austin', 'Salt Lake City', 'Montpelier',
'Richmond', 'Olympia', 'Charleston',
'Madison', 'Cheyenne'
]
总结
综上,如果要做从0到1的业务,尽可能用第一层次的工具,这样最有助于快速落地。但是如果是要做增量,尤其是困难的增长,第三第四层次是首选,因为更有助于深刻理解数据。
本文为阿里云原创内容,未经允许不得转载。
Javascript 机器学习的四个层次的更多相关文章
- JavaScript框架设计(四) 字符串选择器(选择器模块结束)
JavaScript框架设计(四) 字符串选择器(选择器模块结束) 经过前面JavaScript框架设计(三) push兼容性和选择器上下文的铺垫,实现了在某一元素下寻找,现在终于进入了字符串选择器 ...
- Javascript函数调用的四种模式
一 前言 Javascript一共有四种调用模式:方法调用模式.函数调用模式.构造器调用模式以及apply调用模式.调用模式不同,对应的隐藏参数this值也会不同. 二 方法调用模式 函数作为对象的属 ...
- Javascript多线程引擎(四)
Javascript多线程引擎(四)--之C语言单继承 因为使用C语言做为开发语言, 而C语言在类的支持方面几乎为零, 而Javascript语言的Object类型是一个非常明显的类支持对象,所以这里 ...
- 2019年11个javascript机器学习库
Credits: aijs.rocks 虽然python或r编程语言有一个相对容易的学习曲线,但是Web开发人员更喜欢在他们舒适的javascript区域内做事情.目前来看,node.js已经开始向每 ...
- JavaScript机器学习之线性回归
译者按: AI时代,不会机器学习的JavaScript开发者不是好的前端工程师. 原文: Machine Learning with JavaScript : Part 1 译者: Fundebug ...
- BI实施的四个层次
满足业务需求 注重数据分析汇总 统一.高效的系统集成越来越麻烦.管理人员穿梭在具有不同风格.使用逻辑的系统间,越来越厌倦,众多系统之间的业务逻辑.数据含义不一致,使用户无法判 断数据的准确性.任何一个 ...
- JavaScript 编写随机四位数验证码(大小写字母和数字)
1.JavaScript编写随机四位数验证码,用到的知识点为: a.Math对象的随机数:Math.random() b.Math对象的取整 :Math.floor() c.处理所需要的下标个数 ...
- JavaScript学习记录四
title: JavaScript学习记录四 toc: true date: 2018-09-16 20:31:22 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...
- 《JAVASCRIPT高级程序设计》节点层次和DOM操作技术
DOM可以将任何HTML和XML文档描绘成一个由多层次节点构成的结构.节点分为几种不同的类型,每种类型分别表示文档中不同的信息,每种类型都继承与Node接口,因此都共同享有一些属性和方法,同时,也拥有 ...
- JavaScript机器学习之KNN算法
译者按: 机器学习原来很简单啊,不妨动手试试! 原文: Machine Learning with JavaScript : Part 2 译者: Fundebug 为了保证可读性,本文采用意译而非直 ...
随机推荐
- 【2012 Asia ChangChun Regional Contes】 [Math Magic] 动态规划
题目链接: https://acm.hdu.edu.cn/showproblem.php?pid=4427 解法: 题目m范围较小$m\leq 1000$,n 范围也较小 $n\leq 1000$, ...
- Bootstrap前端开发框架
一 Bootstrap 简介 Bootstrap 来自 Twitter(推特),是目前最受欢迎的前端框架.Bootstrap 是基于 HTML.CSS 和 JAVASCRIPT 的,它简洁灵活,使得 ...
- Cesium之原生控件
1. 控件概述 Cesium的开始,基本上是从new一个Viewer开始 // ... <div id="cesiumContainer"></div> & ...
- 工作记录:Vue项目中使用WebSocket通讯
WebSocket介绍 以下内容摘自维基百科: WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型的应用层.WebSocket协议在2011年由IETF标准化为R ...
- hdfs disk balancer 磁盘均衡器
目录 1.背景 2.hdfs balancer和 hdfs disk balancer有何不同? 3.操作 3.1 生成计划 3.2 执行计划 3.3 查询计划 3.4 取消计划 4.和disk ba ...
- APP备案通知
截至2024年4月1日前,所以已上市APP均需备案,未备案的可以登陆云擎官网进行备案. 关于工信部开展在中华人民共和国境内从事互联网信息服务的APP主办者,应当依法履行备案手续,未履行备案手续的,不得 ...
- JSON格式化 动态生成表格 表格转置 行列转换 Excel导出
先看效果 初始化: JSON格式化 : 生成表格-方式1 : 生成表格-方式2 : Excel导出 需要行求和.列求和功能的查看 JSON格式化 动态生成表格 表格转置 行列转换 Excel导出 行求 ...
- KingbaseESV8R6等待事件之LWLock buffer_mapping
等待事件含义 当会话将数据块与共享缓冲池中的缓冲区关联时,会发生此等待事件. 类似Oracle cbc闩锁的是一种Kingbase的轻量级锁lwlock,这个锁的名字在不同数据库版本中可能有所不同,我 ...
- [Android开发学iOS系列] 和一个真正iOS开发的区别?
和一个真正iOS开发的区别? 学习iOS的这段时间, 我一直在思考和感受着自己和一个真正做了几年iOS的dev之间的区别. 同时也在反向思考, 我自己和一个新学Android的人, 又有什么区别. 也 ...
- #贪心#洛谷 6927 [ICPC2016 WF]Swap Space
题目 分析 可以发现能将硬盘容量变大的优先,这种硬盘就是以格式化前的大小升序排序. 然后如果硬盘容量变小,那就是先填格式化后较大的硬盘(因为装完可以提供较大的空间) 代码 #include <c ...