用代码实现机器学习算法可以让你对该算法及其工作原理有深入的了解。
在本文中,您将学习如何有效地实现机器学习算法,以及如何最大化从这些项目中学习到的知识。
通过我的新书《掌握机器学习算法》 开始您的项目,其中包含分步教程和所有示例的Excel电子表格文件。
让我们开始吧。

照片由 Maura McDonnell 拍摄,部分权利保留。
实现机器学习算法的好处
您可以将机器学习算法的实现作为学习应用机器学习的策略。您还可以为自己开辟一个算法实现领域的利基和技能。
算法理解
实现机器学习算法将使您对算法的工作原理有深入的实际认识。通过将向量和矩阵视为数组,并理解对这些结构进行转换的计算直觉,这种知识还可以帮助您内化算法的数学描述。
实现机器学习算法需要大量的微小决策,而这些决策通常在正式的算法描述中缺失。学习和参数化这些决策可以快速将您提升到对给定方法的中级和高级理解水平,因为相对很少有人花时间将一些更复杂的算法作为学习练习来实现。
获取您的免费算法思维导图

方便的机器学习算法思维导图样本。
我创建了一份方便的思维导图,其中包含60多种按类型组织的算法。
下载、打印并使用它。
还可以独家访问机器学习算法电子邮件迷你课程。
实践技能
通过手工实现机器学习算法,您正在培养宝贵的技能。例如掌握算法的技能,有助于开发生产系统的技能,以及可用于该领域经典研究的技能。
您可以发展的技能包括以下三个示例:
- 精通:算法的实现是掌握算法的第一步。当您实现算法时,您将被迫深入理解算法。您还将创建自己的实验环境进行调整,以帮助您随着时间的推移内化其执行的计算,例如通过调试和添加用于评估运行过程的度量。
- 生产系统:通常需要为生产系统定制算法实现,因为需要对算法进行更改以提高效率和效果。更好、更快、资源消耗更少的性能最终可以为企业带来更低的成本和更高的收入,而手工实现算法可以帮助您掌握交付这些解决方案的技能。
- 文献综述:在实现算法时,您正在进行研究。您将被迫查找和阅读算法的多个经典和正式描述。您还可能查找和代码审查算法的其他实现,以确认您的理解。您正在进行有针对性的研究,并学习如何阅读和实际利用研究出版物。
流程
您可以遵循一个流程来加速您从头开始学习和实现机器学习算法的能力。您实现的算法越多,您就会变得越快、越有效率,并且您将更多地开发和定制自己的流程。
您可以使用下面概述的流程。
- 选择编程语言:选择您要用于实现的编程语言。此决策可能会影响您在实现中可以使用哪些 API 和标准库。
- 选择算法:选择您想从头开始实现的算法。尽可能具体。这意味着不仅是算法的类别和类型,还包括选择一个特定的描述或实现。
- 选择问题:选择一个经典问题或一组问题,您可以使用它们来测试和验证您的算法实现。机器学习算法并非孤立存在。
- 研究算法:查找论文、书籍、网站、库以及您能阅读和学习的任何其他算法描述。虽然您理想情况下会有一个核心算法描述作为起点,但您需要对算法有多种视角。这很有用,因为多种视角将帮助您更快地内化算法描述,并克服描述中的任何模糊或假设造成的障碍(算法描述中总会有模糊之处)。
- 单元测试:为每个函数编写单元测试,甚至从项目开始就考虑测试驱动开发,这样您就可以在实现代码的每个单元之前被迫理解其目的和预期。
我强烈建议将算法从一种语言移植到另一种语言,作为沿着这条路径快速进步的方式。您可以找到大量开源算法实现,您可以对其进行代码审查、绘图、内化并在另一种语言中重新实现。
考虑在开发代码时以及开发完成后将其开源。对其进行良好的注释,并确保它提供了有关如何构建和使用它的说明。该项目将为您正在开发的技能提供宣传,并可能为其他希望开始机器学习之路的人提供灵感和帮助。您甚至可能很幸运地找到一位足够感兴趣的程序员为您进行审计或代码审查。您获得的任何反馈都将是无价的(即使是作为动力),积极寻求它。
扩展
实现算法后,您可以探索对其实现进行改进。您可以探索的改进示例包括:
- 实验:您可以将算法实现中的许多微小决策公开为参数,并对这些参数的变化进行研究。这可以带来新的见解,并消除算法实现中的模糊之处,您可以共享和推广这些见解。
- 优化:您可以通过使用工具、库、不同的语言、不同的数据结构、模式和内部算法来探索使实现更有效率的机会。您对经典计算机科学的算法和数据结构的了解在这种工作中非常有益。
- 专业化:您可以探索使算法更具体于某个问题的方法。在创建生产系统时,这可能是必需的,也是一项宝贵的技能。使算法更具问题特定性还可以提高效率(例如运行时间)和效果(例如准确性或其他性能度量)。
- 泛化:通过使特定算法更通用,可以创造机会。程序员(像数学家一样)在抽象方面拥有独特的技能,您可能会发现如何将算法应用于更一般的类问题或完全不同的问题。
局限性
通过手工实现机器学习算法,您可以学到很多东西,但也有一些缺点需要牢记。
- 冗余:许多算法已经有实现,其中一些实现非常健壮,已被世界各地的数百甚至数千名研究人员和从业人员使用。您的实现可能被视为冗余,是对社区已投入的努力的重复。
- 错误:即使有熟练的程序员和单元测试,用户很少的新代码也更容易出现错误。使用标准库可以降低算法实现中出现错误的几率。
- 非直观的跳跃:由于涉及复杂的数学,某些算法依赖于非直观的推理或逻辑跳跃。有可能一个不理解这些跳跃的实现会受到限制,甚至是不正确的。
很容易对机器学习算法的开源实现发表评论并提出许多代码审查问题。要欣赏实现中编码的非直观效率则要困难得多。这可能是一个思维陷阱。
您可能会发现,在考虑如何更改复杂算法以使其在程序上不那么优雅但计算上更有效率之前,从一个较慢的直观实现开始会很有益。
示例项目
有些算法比其他算法更容易理解。在本文中,我想为直观的算法提出一些建议,您可以从这些算法中选择您的第一个机器学习算法来从头开始实现。
- 普通最小二乘法线性回归:使用二维数据集,并根据 y 对 x 进行建模。打印算法每次迭代的误差。考虑绘制最佳拟合线和算法每次迭代的预测,以了解更新如何影响模型。
- k-最近邻:考虑使用二维数据集,包含 2 个类别,甚至是您用方格纸创建的数据集,以便您可以绘制它们。一旦您能够绘制并做出预测,您就可以绘制模型每次做出预测决策时创建的关系。
- 感知器:被认为是简单的人工神经网络模型,与回归模型非常相似。您可以跟踪并绘制模型学习数据集的性能。
总结
在本文中,您了解了手工实现机器学习算法的好处。您了解到,通过遵循此路径,您可以理解算法、进行改进并培养宝贵的技能。
您学会了一个简单的流程,您可以在实现多个算法时遵循和定制该流程,并且您学会了三种可以作为您第一个从头实现的算法。
再次感谢。
请继续保持。
谢谢 Surajit!
很棒的文章——对于如何推进这个过程,有一些很棒的想法。感谢您不断鼓励我们,并用您的想法和方法帮助社区。非常有帮助。
谢谢 Joshua。
我已经订阅了,但当我谷歌搜索“为机器学习代码编写测试用例”时,我又偶然发现了您的网站。您在上面提到编写单元测试是实现机器学习算法的关键部分。那么,您认为在编写单元测试时,除了编程的一般注意事项之外,还有什么特别需要考虑的吗?
当然可以。
首先,您必须确认实现的正确性。实现中的大量小函数意味着编写特定的功能测试会更容易。例如,我记得在 fortran 中使用 lapack 实现了很多 linalg,用 octave 准备测试输入输出,并用单元测试和我的 fortran 代码重现结果。
更广泛的集成测试可能需要随机数种子以实现可重现性和概率性输出确认。例如,我的高斯随机数生成器真的高斯吗?通过查看 1000 个样本的均值和标准差等来判断。
对于生产系统,我认为您还必须拥有自动系统测试来确认技能。这可能意味着在众所周知的训练集上重新训练,并在测试集上进行评估,并确认预期的结果(概率上)。它也可能意味着某种性能的棘轮,例如,测试性能在验证测试集上不会低于 x,其中 x 随着模型的改进而继续增加。
希望这些能作为一个开始有所帮助。
感谢您的这篇文章。
您了解 SVM(支持向量机)吗?
我认为这些算法可以在地图上占有一席之地。
是的 Ping,我把它省略了,因为它不太适合。我需要更新地图以包含它。
大家好,我是 NIT Raipur 的一名学生,目前正在实施一个项目来展示我学院的虚拟游览……那么,有没有办法让我将机器学习算法用于虚拟游览呢?
也许是一个根据上下文提供评论的聊天机器人?
很棒的文章。从零开始学习算法相当于摆弄或拆解电子设备以了解其内部工作原理。它既有趣又非常有启发性!它还消除了当我们使用库中现成的实现时围绕它们的神秘光环。然后,我们可以做出更好、更明智的决定!
关于机器学习中的单元测试:我们应该测试什么?鉴于模型的输出由于许多随机因素(初始化、数据顺序等)而不确定,我们应该检查什么?错误在某些范围内?网络的结构(如果我们处于深度学习领域)是我们期望的吗?我很想知道您的看法。
提前感谢你的时间和关注!
好问题。
尝试并首先测试函数或模块。
对于算法,也许使用一个定义清晰的线性问题/s,它可以被解决,并测试解决方案或在容差范围内的解决方案。
对于像我这样的初学者来说,这篇文章写得很好……
很高兴它有帮助。
请,我是一名学生,我被要求使用机器学习来检测合作社的欺诈行为,请问我该如何进行这个项目,因为我对机器学习一无所知?
我建议先清楚地定义问题。
https://machinelearning.org.cn/how-to-define-your-machine-learning-problem/
如果一个人担任技术支持工程师,同时学习机器学习和数据分析……并且有能力学习所有这些……他有进入数据科学行业的可能吗?
当然!
极好的文章,必须仔细考虑机器学习算法才能有效解决问题。
感谢您的知识分享。🙂
来自巴西的问候
我很高兴它能帮到你。
很棒的文章。当我读到这篇文章时,我实际上正在实现一个算法。我喜欢实现和掌握机器学习算法,但我的问题是它需要大量时间,有时需要 2-3 天,如果我在某个概念上卡住了。我的疑问是如何处理掌握算法时的延迟,你知道这需要很长时间。花一两天来掌握算法是否合适?
谢谢,很高兴它帮到了你!
很棒的文章!尽管我的研究生专业是数据科学,但我一直在努力学习和实现 Python 中的机器学习或深度学习算法。我可以将其用于我的学习过程。非常感谢。
谢谢,我很高兴这能有所帮助。
谢谢博士,感谢您分享算法的实际和一些理论方面!
我想问一下生产系统是什么意思?您所说的“更好、更快、资源消耗更少的性能最终可以为企业带来更低的成本和更高的收入,而手工实现算法可以帮助您掌握交付这些解决方案的技能”是什么意思?
生产系统:通常需要为生产系统定制算法实现,因为需要对算法进行更改以提高效率和效果。更好、更快、资源消耗更少的性能最终可以为企业带来更低的成本和更高的收入,而手工实现算法可以帮助您掌握交付这些解决方案的技能
生产是指企业内部用于解决问题的运营系统。例如,不是玩具问题或 Kaggle 竞赛。
嗨 Jason。很棒的文章。有趣的是,您以同样的效力论证了同一问题的两个方面。我构建了一个基于梯度下降的回归和分类包,目前正在撰写一篇教程博客,引导读者完成实现、实验和应用方面的过程。我读过《从零开始的机器学习算法》,这是一个很棒的资源。您能否推荐一些其他可能作为模型的“教程”博客?理想情况下,该博客会:
– 以创新和引人入胜的方式呈现理论
– 以能吸引读者注意力的方式整合代码和文本
– 呈现引人入胜的实验结果
– 将算法应用于真实数据集或问题
提前感谢
j2
干得不错。
好问题。如果你指的是教学理论,那我帮不了你。
在过去的 6 年里,我发展了自己的风格。
你可以从例子中学习,也许可以从计算机视觉或 GAN 的一些近期例子开始。
https://machinelearning.org.cn/start-here/
我已经订阅了,但我发了三次问题都没有得到回复。尊敬的先生,我喜欢您解释算法的方式。我需要实现 NSGA-III,其中包括拥挤距离和锦标赛概念以及 Pareto 前沿。
抱歉,我没有关于这个主题的教程。
嗨,您能帮我实现一个算法吗?我很难从文章中理解这个算法。
抱歉,我没有能力为您实现算法。
写得很好,今天我学到了机器学习的基础知识。谢谢。
干得好!
由于我想为我的研究生研究做一个推荐系统,我应该使用哪种机器学习技术?
kNN 模型是一个很好的起点。
https://machinelearning.org.cn/tutorial-to-implement-k-nearest-neighbors-in-python-from-scratch/