Javascript 机器学习的四个层次

简介: Atwood定律说,凡是可以用Javascript实现的应用,最终都会用Javascript实现掉。作为最热门的机器学习领域,服务端是Python的主场,但是到了手机端呢?Android和iOS里默认都没有Python。但是有浏览器的地方就有js,现在还有个新场景 - 小程序。

来源: Alibaba F2E
作者:旭伦

image.png

Atwood定律说,凡是可以用Javascript实现的应用,最终都会用Javascript实现掉。作为最热门的机器学习领域,服务端是Python的主场,但是到了手机端呢?Android和iOS里默认都没有Python。但是有浏览器的地方就有js,现在还有个新场景 - 小程序。

除此之外,为了可以在不联网情况下进行训练的,也有支持本地框架比如React Native的。

可以说,只要有前端的地方,就有机器学习的框架在。

js唯一的问题在于,变化太快,每年都有很多新库出现,但是也有不少老的库宣布不维护了。但是,万变不离其宗,工具本身虽然经常有变化,但是它们的类型是非常稳定的。

选择机器学习工具的方法论

我们要写机器学习算法,需要什么样的工具呢?

机器学习工具可以分为以下四个层次:

image.png

层次一:直接服务于具体领域的框架

首先我们需要直接服务于具体领域的框架,比如处理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,我们来看个经典的强化学习的例子:

image.png

使用浏览器的local storage和indexdb作为存储,边训练边展示训练效果的过程,很有前端的风范。

我们再看另一个大厂微软的例子,支持webGL和wasm,基于浏览器不容易:

image.png

另外需要强调的是,用于前端的框架并不是简单的把native或者python框架移植过来的,比如说它要处理兼容性的问题:

image.png

很多同学都对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 neighborsconst 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

比如各种数学函数:

image.png

再比如各种随机分布:

image.png

我们以正态分布为例,看看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的业务,尽可能用第一层次的工具,这样最有助于快速落地。但是如果是要做增量,尤其是困难的增长,第三第四层次是首选,因为更有助于深刻理解数据。

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运维监控再添新品,F5联合智维数据推出应用质量主动拨测解决方案

一直以来&#xff0c;业务的稳定性和客户体验是企业各个部门都关注的重点&#xff0c;也是企业数字化转型的重要支撑。但在实际的运维环境中&#xff0c;如果只从服务端的视角进行监控&#xff0c;往往会出现数据中心内部监控体系显示设备状态正常&#xff0c;但却收到了客户端…

排查指南 | 两个案例学会从埋点排查 iOS 离线包

简介&#xff1a; 首次打开离线包白屏以及报错“-1009”等该如何处理呢&#xff1f; 离线包原理 以一次启动离线包的流程为例&#xff0c;离线包的加载流程分为两种场景&#xff0c;第一种是离线包下载好的场景&#xff0c;流程如图1所示&#xff0c;第二种是离线包没下载好的…

如何设计可靠的灰度方案

简介&#xff1a; 一个较大的业务或系统改动&#xff0c;往往会影响整个产品的用户体验或操作流程。为了控制影响面&#xff0c;可以选取一批特定用户、流程、单据等&#xff0c;只允许这一部分用户或数据按照变更后的新逻辑在系统中流转&#xff0c;而另一部分用户仍然执行变更…

linux如何设置mac快捷键,在Ubuntu上使用macOS的快捷键

因为常用机一台Mac&#xff0c;一台Linux&#xff0c;都频繁使用&#xff0c;两个系统不同的快捷键已经让人精神分裂了&#xff01;macOS几乎所有的快捷键都基于command键&#xff0c;全选(cmda)、复制(cmdc)、粘贴(cmdv)、开关标签页(cmdt/w)、切换窗口(cmdtab)、保存(cmds)、…

IDC报告:阿里云领跑中国数据库市场年度份额首超传统厂商

简介&#xff1a; IDC报告显示&#xff0c;2020年中国关系型数据库软件市场规模达到121.8亿元&#xff0c;同比增长36.5%。其中&#xff0c;以公有云模式部署的关系型数据库市场占比达到51.5%&#xff0c;首次超过传统线下部署模式市场规模&#xff0c;预计到2025年将继续走高&…

稳若磐石的「云上奥运」背后,是云计算新界面的崛起

简介&#xff1a; 今年奥运会首次采用阿里云支撑全球转播&#xff0c;这是奥运迈入数字时代的重要一步。对于这届特殊的奥运会来说&#xff0c;技术至关重要。我们相信&#xff0c;这次创造历史的实践&#xff0c;将为未来支撑更多体育爱好者把“云观赛”转变为参与国际体育赛事…

10分钟!构建支持10万/秒请求的大型网站

简介&#xff1a; 应用网关作为应用的统一接入层&#xff0c;它的发展和演进也是伴随着应用架构的变化&#xff0c;大家都知道企业应用从最早期 SOA 时代发展到微服务的时代。在 SOA 时代&#xff0c;传统的企业服务总线承担了企业应用的统一接入层&#xff1b;但是发展到微服务…

服务实体经济、战略级行业再下一城,钉钉发布制造行业解决方案2.0

编辑 | 宋慧 出品 | CSDN 云计算 1月5日&#xff0c;钉钉召开主题为“数字新生”的2022制造业钉峰会。会上&#xff0c;钉钉正式发布制造行业解决方案2.0&#xff0c;该方案以“码上制造”产品为制造行业专属底座&#xff0c;提供设备上钉、计件日结等基础产品&#xff0c;同时…

阿里云边缘云全新架构升级,助力CDN操控新体验

简介&#xff1a; 本次升级根据上万企业客户的使用反馈和行业应用特征&#xff0c;从简单开通到个性化定制&#xff0c;从内容分发到边缘计算完整解决方案&#xff0c;对客户侧的使用体验进行了全局梳理和全链路优化&#xff0c;推进边缘云CDN操控革新&#xff0c;并逐步构建面…

key redis 遍历_快乐运维Redis大数据量查询与清理

一、 keys命令(生产环境禁止使用)简单粗暴&#xff0c;由于Redis单线程这一特性&#xff0c;keys命令是以阻塞的方式执行的&#xff0c;keys是以遍历的方式实现的复杂度是 O(n)&#xff0c;Redis库中的key越多&#xff0c;查找实现代价越大&#xff0c;产生的阻塞时间越长。key…

linux部分基础命令总结,Linux常用基础命令总结

近期自己学习了一下Linux&#xff0c;写这篇博客以便于对自己的一个总结&#xff0c;记录自己的学习情况&#xff0c;奥利给&#xff01;想对Linux熟练掌握&#xff0c;就必须学会它的操作命令&#xff0c;虽然可能会花费一些时间&#xff0c;不过从长远的角度来说&#xff0c;…

MaxCompute执行引擎核心技术DAG揭秘

简介&#xff1a; 作为业界少有的EB级数据分布式平台&#xff0c;MaxCompute每天支撑上千万个分布式作业的运行。这些作业特点各异&#xff0c;既有包含数十万计算节点的超大型作业&#xff0c;也有中小规模的分布式作业。不同用户对于不同规模/特点的作业&#xff0c;在运行时…

自定义导航页_带你回归“真”的导航页

曾经浏览器主页是我们流向各大网站的要道从这里我们可以轻而易举的去往想要去的网站特别是在信息和专业性越来聚集的今天传统的主页难免令人有些审美疲劳或者说花里胡哨hao1232345是这些老牌的主页网站有些审美疲劳随着导航越来越细节化广告也越来越多美感也更少360主页qq主页百…

Redis 压缩列表原理与应用分析

作者 | 西瓜来源 | JAVA架构进阶之路摘要Redis是一款著名的key-value内存数据库软件&#xff0c;同时也是一款卓越的数据结构服务软件。它支持字符串、列表、哈希表、集合、有序集合五种数据结构类型&#xff0c;同时每种数据结构类型针对不同的应用场景又支持不同的编码方式。…

基于 MaxCompute 的智能推荐解决方案

简介&#xff1a; 在互联网行业红利已过、在获客成本越来越高、在用户在线时长全网基本无增长以及信息大爆炸的情况下&#xff0c;如何更好的转化新用户和提升老用户粘性就变得至关重要&#xff0c;智能化的个性化推荐无疑是经过验证的重要手段之一&#xff0c;我们每天使用的移…

基于MaxCompute+开放搜索的电商、零售行业搜索开发实践

简介&#xff1a; 搜索一直是电商行业流量来源的核心入口之一&#xff0c;如何搭建电商行业搜索并提升搜索效果&#xff0c;一直是电商行业开发者努力攻克的难题。基于传统数据库或开源引擎虽然能够搭建基础搜索服务&#xff0c;但随着商品数据的增多和业务流量的增长&#xff…

快速搭建实验环境:使用 Terraform 部署 Proxmox 虚拟机

作者 | Addo Zhang来源 | 云原生指北自从用上 m1 的电脑&#xff0c;本地开发环境偶尔会遇到兼容性的问题。比如之前尝试用 Colima 在虚拟机中运行容器运行时和 Kubernetes&#xff0c;其实际使用的还是 aarch64 虚拟机&#xff0c;实际使用还是会有些差异。手上有台之前用的黑…

linux grub 下载,GRUB 2.04发布下载,附新功能介绍

GRUB 2.04版本发布了&#xff0c;它是在GRUB 2.02/2.00的基础上更新的&#xff0c;GRUB 2.02是目前使用得最多的多重启动管理器&#xff0c;全称为GRand Unified Bootloader&#xff0c;使用它可以引导几乎所有的操作系统&#xff0c;包括Unix、Linux、Windows&#xff0c;GRUB…

Go 调用 Java 方案和性能优化分享

简介&#xff1a; 一个基于 Golang 编写的日志收集和清洗的应用需要支持一些基于 JVM 的算子。 作者 | 响风 来源 | 阿里技术公众号 一 背景 一个基于 Golang 编写的日志收集和清洗的应用需要支持一些基于 JVM 的算子。 算子依赖了一些库: Groovy aviatorscript 该应用有如…

低代码发展专访系列之八:低代码平台能够打破企业「应用孤岛」现象吗?

话题&#xff1a;低代码发展系列专访 前言&#xff1a;2019年开始&#xff0c;低代码爆火。有人认为它是第四代编程语言&#xff0c;有人认为它是开发模式的颠覆&#xff0c;也有人认为是企业管理模式的变革……有很多声音&#xff0c;社区讨论很热烈。CSDN随后展开低代码平台产…