零、前言

早在 2008 年,当我为电动汽车的自适应牵引力控制系统开发算法时,我就开始了对机器学习的第一次深入研究。此后不久,我离开了机械工程领域,共同创办了一家营销技术初创公司。几周内,我意识到 ML 对我和我的公司有多重要,我决定阅读我能找到的关于 ML 的每一本书和每一篇论文。

在接下来的几年里,我埋头苦读,阅读了几十本教科书和数百篇学术论文,从头开始写我能找到的每一个算法,并围绕 ML 慢慢发展出一种直觉和哲学。

在那段时间里,我发现了一些我不太满意的关于 ML 生态系统的事情。当时有一种浓厚的守门文化。用 Python 以外的语言编写 ML 的想法被认为是荒谬的。有一种观点认为,只有去学校学习语言的人才能在这个领域取得成功。许多公开的阅读材料,如博客文章和在线教程,都是用明显的数学语气写的,从而疏远了不熟悉线性代数和向量微积分的读者。

与此同时,我正在教一个 JavaScript(T2)编程训练营,我的许多学生——自学的网络开发人员——都对 ML 感兴趣。我很难给他们指出正确的方向;他们当时唯一的选择是转向 Python。

这让我很沮丧,因为我知道我的学生足够聪明,能够掌握 ML,我也知道 ML 不需要局限于 Python。我还感觉到,许多使用流行的 Python 库的开发人员实际上并不了解算法的机制,并且在尝试实现它们时会遇到问题。守门起到了适得其反的作用,只是将这个强大的算法家族变成了黑盒,被不愿意深入挖掘和学习的开发人员随意应用。

我想向世界证明 ML 可以教给任何人,可以用任何语言写,于是开始用 JavaScript 写一系列名为机器学习的文章。这些文章从第一性原理开始教授 ML 算法,没有行话,侧重于实现而不是数学描述。

我选择 JS 有几个原因。首先,JS 中缺少 ML 库会迫使我的读者编写自己的实现,并发现 ML 不是魔法,只是代码。第二,JS 还没有真正自成体系(当时 Node.js 还不存在),对于严重的问题一般认为是编程语言的糟糕选择,但我想证明 ML 可以用任何语言编写。最后,我想使用一种大多数网络开发人员,尤其是自学成才的开发人员都很熟悉的语言。选择一种后端语言,如 PHP 或 Java,将意味着排除很大一部分开发人员,所以我选择了每个网络开发人员都知道的语言:JS。

这个系列虽然现在已经过时了,但很受欢迎。超过 100 万人阅读了我的文章,我从许多读者那里听说,我的文章激励他们走上新的道路;我认为这是我最大的职业成功之一。

这本书是对我在 JavaScript 系列中的机器学习的一个谦逊而现代的更新。自 2008 年以来,情况发生了很大变化。JS 现在是最流行的编程语言,ML 正在迅速民主化。开发人员可以使用 AWS 或谷歌云通过一个应用编程接口调用来调用巨大的计算资源,今天的智能手机的处理能力可以与十年前的台式计算机相媲美。

与我以前的文章系列类似,这本书将从第一性原理开始教你 ML 算法。我们将专注于开发 ML 的概念和实现,而不会过分偏离数学描述。然而,与旧系列不同,今天的 JS 领域实际上有 ML 库和实现可用。因此,有时我们会编写自己的算法,有时我们会依赖现有的库。

这本书的目标不是教你每一个存在的 ML 算法,也不是让你成为任何一个算法的专家。相反,我的目标是教你,一个有经验的网络开发人员,你需要知道什么来开始和适应 ML,这样你就可以自信地开始你自己的教育之旅。

这本书是给谁的

这本书是为想要开始使用 ML 的有经验的 JS 开发人员准备的。总的来说,我会假设你是一个称职的 JS 开发人员,除了你在高中学到的知识之外,你对 ML 或数学几乎没有经验。就 JS 能力而言,您应该已经熟悉了算法、模块化代码和数据转换的基本概念。我还假设您可以阅读 JS 代码并理解其意图和机制。

这本书不是为新手程序员准备的,尽管你仍然可以从中获得一些东西。这本书也不是为已经熟悉 ML 的读者准备的,因为大多数内容你都会很熟悉——尽管在这些页面中可能会有一些小的智慧对你有所帮助。

如果你想踏入 ML 领域,但又不知道在一个庞大而混乱的生态系统中从何下手,这本书是你的不二之选。无论你是想在职业生涯中有所转变,还是只是想学习一些新的东西,我相信你会发现这本书很有帮助。

这本书涵盖了什么

第 1 章探索 JavaScript 的潜力,看一下 JavaScript 编程语言、它的历史、生态系统以及对 ML 问题的适用性。

第 2 章数据探索讨论了构成每一个 ML 算法基础和动力的数据,以及您可以为 ML 应用预处理和准备数据所做的各种事情。

第 3 章机器学习算法之旅,带你简单游览 ML 景观,将其划分为算法的类别和家族,就像地图上的网格线帮助你导航不熟悉的地形一样。

第 4 章使用聚类算法进行分组,实现了我们的第一个 ML 算法,重点是自动发现和识别数据中模式的聚类算法,以便将相似的项目分组在一起。

第 5 章分类算法讨论了一大类 ML 算法,用于自动分类带有一个或多个标签的数据点,例如垃圾邮件/非垃圾邮件、正面或负面情绪或任意数量的任意类别。

第 6 章关联规则算法研究了几种用于根据共现频率在数据点之间进行关联的算法,例如经常在电商商店一起购买的产品。

第 7 章用回归算法进行预测,查看时间序列数据,如服务器负载或股票价格,并讨论各种算法,可用于分析模式和对未来进行预测。

第八章人工神经网络算法,教你神经网络的基础,包括它们的核心概念、架构、训练算法和实现。

第 9 章深度神经网络,深入挖掘神经网络,探索各种可以解决图像识别、计算机视觉、语音识别和语言建模等问题的奇异拓扑。

第 10 章实践中的自然语言处理,讨论了自然语言处理与 ML 的重叠。当你将机器学习应用于自然语言任务时,你会学到一些常用的技术和策略。

第 11 章在实时应用中使用机器学习,讨论了在生产环境中部署 ML 应用的各种实用方法,特别关注数据管道流程。

第 12 章为你的应用选择最佳算法,回到基础,讨论你在 ML 项目的第一阶段必须考虑的事情,特别关注为给定的应用选择最佳算法或算法集。

充分利用这本书

如果你有一段时间没有用 JS 编程了,最好在开始之前给自己复习一下。特别是,本书中的示例将使用 ES6/ES2015 语法;我将在第一章中向您介绍新的语法,但您可能还想自己熟悉它。

如果你还没有安装 Node.js,你会想现在安装它。本书中的示例是使用 Node.js 版本 9.6.0 编写的,尽管我预计大多数示例适用于任何大于 8 的 Node.js 版本,也适用于 Node.js 版本 10。

你不需要太多的数学教育就能读完这本书,但我想你已经关注了高中的数学课程。如果你不太记得概率、统计或代数,你可能想在这些话题上刷新自己,因为它们在 ML 中很普遍。虽然我已经尽力避免深入探讨高级数学概念,但我确实必须在本书中介绍一些,这样你至少可以对数学有一定程度的了解,并愿意自己研究一些精选的数学概念。

下载示例代码文件

你可以从你在www.packtpub.com的账户下载这本书的示例代码文件。如果您在其他地方购买了这本书,您可以访问www.packtpub.com/support并注册将文件直接通过电子邮件发送给您。

您可以按照以下步骤下载代码文件:

  1. 登录或注册www.packtpub.com
  2. 选择“支持”选项卡。
  3. 点击代码下载和勘误表。
  4. 在搜索框中输入图书的名称,并按照屏幕指示进行操作。

下载文件后,请确保使用最新版本的解压缩文件夹:

  • 视窗系统的 WinRAR/7-Zip
  • zipeg/izp/un ARX for MAC
  • 适用于 Linux 的 7-Zip/PeaZip

这本书的代码包也托管在 GitHub 上,网址为https://GitHub . com/packt publishing/hand-On-Machine-Learning-with-JavaScript。如果代码有更新,它将在现有的 GitHub 存储库中更新。

我们还有来自丰富的图书和视频目录的其他代码包,可在【https://github.com/PacktPublishing/】获得。看看他们!

下载彩色图像

我们还提供了一个 PDF 文件,其中包含本书中使用的截图/图表的彩色图像。你可以在这里下载:https://www . packtpub . com/sites/default/files/downloads/handsonmachineneleringwith JavaScript _ color images . pdf

使用的约定

本书通篇使用了许多文本约定。

CodeInText:表示文本中的码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟网址、用户输入和推特句柄。这里有一个例子:“使用命令行、您最喜欢的 IDE 或您的文件浏览器在您的机器上的某个地方创建一个名为MLinJSBook的目录,其中有一个名为Ch1-Ex1的子目录。”

代码块设置如下:

var items = [1, 2, 3 ];
for (var index in items) {
var item = items[index];

 }

当我们希望将您的注意力吸引到代码块的特定部分时,相关的行或项目以粗体显示:

['landscape.jpeg', 'lily.jpeg', 'waterlilies.jpeg'].forEach(filename => {
  console.log("Decolorizing " + filename + '...');
  decolorize('./files/' + filename)
    .then(() => console.log(filename + " decolorized"));
});

任何命令行输入或输出都编写如下:

$ node --version
 V9.4.0

B :表示一个新的术语,一个重要的词,或者你在屏幕上看到的词。

Warnings or important notes appear like this. Tips and tricks appear like this.

取得联系

我们随时欢迎读者的反馈。

综合反馈:发邮件feedback@packtpub.com并在邮件主题中提及书名。如果您对本书的任何方面有疑问,请发电子邮件至questions@packtpub.com

勘误表:虽然我们已经尽了最大的努力来保证内容的准确性,但是错误还是会发生。如果你在这本书里发现了一个错误,如果你能向我们报告,我们将不胜感激。请访问www.packtpub.com/submit-errata,选择您的图书,点击勘误表提交链接,并输入详细信息。

盗版:如果您在互联网上遇到任何形式的我们作品的非法拷贝,如果您能提供我们的位置地址或网站名称,我们将不胜感激。请通过copyright@packtpub.com联系我们,并提供材料链接。

如果你有兴趣成为一名作者:如果有一个你有专长的话题,你有兴趣写或者投稿一本书,请访问authors.packtpub.com

复习

请留下评论。一旦你阅读并使用了这本书,为什么不在你购买它的网站上留下评论呢?然后,潜在的读者可以看到并使用您不带偏见的意见来做出购买决定,我们在 Packt 可以了解您对我们产品的看法,我们的作者可以看到您对他们的书的反馈。谢谢大家!

更多关于 Packt 的信息,请访问packtpub.com