【机器学习】从零实现来理解机器学习算法

从零开始实现机器学习算法的好处

我推广了从零开始实现机器学习算法的观念。

我认为你可以学到很多关于算法是如何工作的。我也认为,作为一名开发者,它提供了一个学习用于机器学习的数学符号、描述以及直觉的桥梁。

在“从零开始实现机器学习算法的好处”这篇文章里,我已经讨论了从零实现机器学习算法的好处。

在那篇文章,我列出的好处如下:

  1. 你获取了知识;
  2. 它提供了一个起点;
  3. 拥有算法和代码的所属权。

在这篇文章中,我对如何利用现有的教程和书籍来缩短这个学习过程表达了一些个人看法。有一些用于初学的丰富资源,但也要堤防一些绊脚石。

下一节,我指出了三本书,你可以照着书籍从零开始实现机器学习算法。

在过去的几年里,我已经在机器学习入门中帮助了许多程序员。根据我的经验,我列出了五项曾困扰过程序员的最常见的障碍,以及你可以用来克服它们的技巧。

最后,你会发现3个快速技巧,用以从代码教程中获得更丰富的知识,并从一个复制粘贴的程序员(如果你碰巧是其中一个)到一个真正深入机器学习算法的学者。

用于实现算法的优秀书籍

我从零实现过许多算法,这些算法直接来自研究论文。这个过程可能非常困难。

跟着别人的教程来做是一个非常温和的开始。有很多优秀的资源,可以让你用来从零开始实现机器学习算法。也许最具权威性的是能指导你完成整个教程的书籍。

从啃书本开始学习有很多好处。例如:

  • 其他人已经研究出了该算法并把它转换成了代码;
  • 你可以使用它作为一个用于修改和实验的已知工作起点。

那么,一步一步引导你完成机器学习算法实现的出色书籍有:

Data Science from Scratch: First Principles with Python by Joel Grus

这本书的确是从零开始,贯穿可视化操作、统计、概率、数据处理,然后是大约12个不同的机器学习算法。

这本书是我今年最喜欢的机器学习初学者书籍之一。

Machine Learning: An Algorithmic Perspective by Stephen Marsland

这本书是我期待已久的这本流行书籍的第二版。它涵盖了大量的不同种类的机器学习算法实现。

我喜欢它既给出了数学描述和伪代码,又包含了能执行的源代码。

Machine Learning in Action by Peter Harrington

该书贯穿了10个最受欢迎的机器学习算法,提供了案例研究问题并用Python代码实例来解决。

我喜欢它用符号和箭头把代码和描述紧密联系在一起的形式。

我是否有漏掉一本从零开始实现机器学习算法的编程教程书籍呢?

如果有,请在评论中指出!

从零实现机器学习算法的5个障碍(以及如何克服它们)

根据教程从零开始实现机器学习算法是很有趣的。但也有可能会成为绊脚石,而且如果你不小心,他们可能会绊倒你并抹杀你的学习动机。

在这一节中,我想指出我所看到的五个常见的绊脚石,以及如何与它们共存,而不是让它们阻碍你。我的目的是让你完全摆脱它并且破浪前行(或是转移到另一个教程)。

用来避免下面障碍的一些好的常规建议是在你深入一个教程之前,仔细检查书籍的评论(或博客帖子的评论)。你要确保代码是能够工作的并且保证你不是在浪费时间。

另一个常规策略是,无论深入的是什么,找出不工作的那部分,并自己去重新实现他们。这是一个强行理解的出色解决方法,但它可能不适合初学者,并且你可能需要一个很好的技术参考资料放在手边。

无论如何,让我们从零开始机器学习教程,深入研究这5个常见的障碍:

1)代码不能正常工作

最糟糕并且最常见的障碍就是实例当中的代码不能正常工作。

事实上,如果你花一些时间浏览亚马逊网站的一些书籍评论或博文评论,很显然,这个问题比你想象的更为普遍。

这是怎么发生的呢?有几个原因可能会给你提供一些线索,可以应用到你自己的修改中并继续使用:

  • 代码从不工作。这意味着,这本书没有经过精心编辑就出版了。在这种情况下,你能做的并不多,除非是进入作者的大脑,并试图推测出他们的想法。或许还可以尝试联系作者本人或是出版商。
  • 语言已变动。这种情况可能会发生,特别是如果该文章是发布已久的或者该书已印刷了很长一段时间。两个很好的例子是Ruby从1.x版本到2.x版本和Python从2.x版本到3.x版本。
  • 第三方库已变动。这通常发生在那些情况下,即实现不完全是从零开始并且使用了一些有用的库,如用于绘图的库。这通常不会那么糟糕。你可以通过经常更新代码来使用最新版本的库以及修改参数来满足API的修改。甚至可以安装一个旧版本的库(如果版本很少或是几乎不需要可能破坏开发环境的其它依赖库)。
  • 该数据集已变动。如果数据文件是一个下载链接,并且已经失效(也许你可以在其它地方找到该文件),这种情况下就有可能会发生。如果这个例子是针对第三方API数据来源,比如Facebook或Twitter,该情况会更加糟糕。这些APIs可以迅速地改变很多。如果可能的话,你最好的办法是了解最新版本的API,并改写代码中的实例。

如果它是一本书、GitHub库、代码下载或者类似的,如果代码不工作,一个好的常规策略是寻找相关的勘误表。有时这些问题已经在书上或作者的网站上修正了。一些简单的谷歌搜索就能找到它们。

2) 代码不规范描述

当从零开始实现算法时,我认为第二个糟糕的绊脚石是提供的代码描述很糟糕。

对于初学者来说,这类问题特别不好,因为你正在努力维持积极性,而实际上你是从练习中学习一些东西。如果代码和文本不一致,所有的这些都会在烟雾中渐渐消失。

我(或许比较温和)把他们称为“糟糕的描述”,因为可能有很多的症状和原因。例如:

  • 代码和描述之间的不匹配。这可能是由于代码和文本在不同时间准备而造成的,并且不能正确地编辑起来。它可能是一些小的,如一个变量名称的变化,或者它可能是整个函数名或函数本身的变化。
  • 缺失的解释。有时,你会得到你所期望获得的大量代码。这是令人沮丧的,特别是书中连篇累牍的代码,可能在屏幕上更容易理解。如果是这样的话,最好的方法是找到在线下载的代码并直接使用它来工作。
  • 过于简洁的解释。有时你会对代码进行解释,但它们可能过于简单,如“使用信息增益”或任何其它的。令人沮丧!你可能还要花更多的时间来研究这个术语,但如果作者在上下文中包含了一个该术语的解释以及相关的实例,那么这就会显得更简单。

一个好的常规方法是在其它的资源里寻找算法的描述,并尝试将它们映射到你所使用的代码中。从本质上讲,是尝试建立你自己的代码描述。

这对初学者来说可能不是一个好的选择,你可能需要转到另一个资源上。

3)代码不符合语言习惯

我们程序员可以对我们语言的 “正确”使用咬文嚼字(如Python代码不是Pythonic)。这其实是一件好事,它显示了对细节和最佳实践的充分关注。

当实例代码不符合语言编写习惯时,它可能会让人排斥。有时它会使代码零散以至于难以理解。

这种情况有许多原因,例如:

  • 来自另一种语言的接口。实例代码可能是另一种编程语言的接口。如在Java中调用FORTRAN或在Python中调用C。在老手眼里,这会很显眼。
  • 作者正在学习语言。有时,作者可能使用一本书或一个教程项目来学习语言。在整个代码示例中,可能会不一致。当实例多次使用难以理解的语言特征和API时,这可能会让人失望甚至分散注意力。
  • 作者没有使用专业语言。这可能是更加微妙的一点,可以通过使用深奥的语言功能和APIs来体现。当你必须研究或解读奇怪的代码时,这可能会让你混淆。

如果你惯用的代码对你非常重要,这些障碍可能会是一个机会。你可以把接口代码从“Java-Python”混合体(或别的什么)化为一个纯Python的实现。

这么做之后,你将得到一个更深层次的算法理解以及更多的代码所属权。

4)代码和数学无关

一个很好的代码示例或教程将提供一个从数学描述到代码的桥梁。

这很重要,因为它允许你跨越代码和数学,并开始为符号和简明的数学描述形成一个直觉。

问题是,有时候这个桥梁可能会被彻底破坏或是丢失。

  • 数学上的错误。这对初学者来说是潜在的,因为建立从数学到代码的关联已经很紧张了。不正确的数学可能会误导或者严重地消耗大量的时间,并且还没有回报。知道这个可能会发生,就是一个很好的开始。
  • 简明的数学描述。方程可以在示例代码中四处散落,让你去弄清楚它究竟是什么,以及它是如何与代码相关联的。你的选择不多,你可以把它当做是一个与数学无关的例子,并参考一个不同的更加完整的参考文本,或者你可以努力把数学与自己的代码关联起来。这更有可能的是作者本身就不熟悉算法的数学描述,而且似乎是事后才添加到文章里的。
  • 缺失的数学。有些参考文献在描述数学时是自由的。在这种情况下,你可能需要找到自己的参考文本,并建立自己的桥梁。这可能不适合初学者,但这是一个技能,很值得去投入时间。

一个初学者可能会坚持代码而忽略数学,建立信心和动力。之后,它将为一个高质量的参考文本以及关联代码和数学付出代价。

你想要擅长于关联代数和标准代码,并为有关过程建立一个直觉。这是一个应用技巧。需要你投入工作与实践。

5)不完整的代码列表

我们在2)中看到,你可以有不带任何描述和长列表的代码。然而,当你没有大量代码的时候,这个问题会逆转。这也就是代码列表不完整时的情况。

事实上,我是一个完整代码列表的忠实信徒。我认为代码列表应该给你所需要的,给你一个“完整”的代码和工作实现,即使它是最简单的情况。

你可以建立一个简单的实例,但你不能运行一个不完整的例子。你必须把它放在工作中并把所有的都联系在一起。

这个障碍可能成为事实的一些原因是:

  • 冗长的描述。冗长的编写可能是一个不完整思维的标志。但有时候,也不一直都是这样。如果理解的不是很好,可能会在潜意识里试图用一堆词来掩饰。如果没有任何代码,你可以把它当作是一个挑战,根据描述来设计算法,并从其它描述和资源来证实它。
  • 代码片段。概念可能会精心描述,然后使用一个小代码片段来证实。这有助于紧密配合代码段的概念,但它需要你自己大量的工作,将其结合在一起,形成一个工作系统。
  • 无样本输出。代码实例经常失误的一个关键方面通常是样本输出。如果有输出的话,当你运行它时,它可以给你一个期待的明确想法。没有样本输出的话,那就完全是猜测。

在某些情况下,把代码聚在一起,这对你可能会是一个有趣的挑战。这同样不适合初学者,但是一旦你有一些算法之后,这也许会是一个有趣的锻炼。

3个诀窍让你从算法实现中获得更多知识

你可以实现一个合理的算法。一旦你这样做过,那么你可以做得更多,并在你知道它之前,你已经建立了你自己非常理解的小算法库。

在这一节中,我想给你3个你可以使用的快速技巧,可以让你从实现机器学习算法过程中获得最多的经验。

  1. 添加先进的特征。以你正常运行的代码为例,并在它的基础上创建。如果教程是好的,它将列出扩展的想法。如果没有,你可以研究一些自己的。在算法的后面列出一系列的候选扩展算法并一个又一个的去实现它们。这至少会迫使你去理解代码的意思并做出修改。
  2. 适应另一个问题。在不同的数据集上运行该算法。如果有任何问题,就解决它。进一步去适应不同的问题实现。如果代码示例是二分类,那么修改它让其适用于多分类或回归问题。
  3. 可视化算法行为。我发现实时绘制算法的性能和行为是一个非常宝贵的学习工具,即使是在今天。你可以在测试集和训练集上开始按时期水平(所有的算法在一定程度上都是迭代的)绘制精确度。在那里,你可以选择特定的可视化算法,如自组织映射模型的二维网格,回归时间序列的系数和k近邻算法的Voronoi划分。

原文发布于微信公众号 - 数据科学与人工智能(DS_AI_shujuren)

原文发表时间:2015-09-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯玄武实验室的专栏

让 iPhone “崩溃” 又有了新方法:只需要一个视频

玄武实验室在 10 月 15 日就发现了视频样本,在深入分析后,我们在微信后台对能够触发这种漏洞的恶意视频进行检测和拦截,保护了大量用户免遭攻击。

5782
来自专栏机器之心

业界 | 英伟达开源硬件加速项目NVDLA:一种标准化的推断加速框架

3619
来自专栏企鹅号快讯

Unity机器学习代理ML-Agents v0.2版本发布

Unity机器学习代理最新版ML-Agents v0.2现已发布!在本版本里,我们作了以下改进: 为Unity SDK和Python API增加了新特性 更多新...

3836
来自专栏大数据文摘

从人脸识别到情感分析,这有50个机器学习实用API!

1735
来自专栏软件开发 -- 分享 互助 成长

结构化分析和方法

结构化分析方法(SA)是一种面向数据流的需求分析方法,适用于分析大型数据处理系统,是一种简单、实用的方法。 基本思想是自顶向下逐层分解。分析结果有一套分层的数据...

2166
来自专栏Albert陈凯

R语言的优劣

https://www.zhihu.com/question/19611094 作者:艾华丰 链接:https://www.zhihu.com/questio...

2603
来自专栏IT派

从人脸识别到情感分析,50个机器学习实用API

API是一套用于构建应用软件程序的规范,协议和工具。在本文中,我们从2017年的清单中删除了停用的API,并利用新元素对其进行了更新。并且,所有的API被归类到...

1451
来自专栏生信技能树

芯片数据分析,so easy?

我最早接触的高通量数据就是RNA-seq,后来接触的也基本是高通量测序结果而不是芯片数据,因此我从来没有分析过一次芯片数据,而最近有一个学员在看生信技能树在腾讯...

2593
来自专栏流柯技术学院

性能测试学习之三—— PV->TPS转换模型&TPS波动模型

TPS = ( (80%*总PV)/(24*60*60*(T/24)))/服务器数量

2482
来自专栏AI研习社

PyTorch vs. TensorFlow月度使用体验总结

日前,英伟达深度学习项目实习生Dominic Monn在medium上发文总结了他使用PyTorch和TensorFlow的一些体会,在文章中,他从安装、使用、...

41215

扫码关注云+社区

领取腾讯云代金券