# 如何实现机器学习算法

> 原文： [https://machinelearningmastery.com/how-to-implement-a-machine-learning-algorithm/](https://machinelearningmastery.com/how-to-implement-a-machine-learning-algorithm/)

在代码中实现机器学习算法可以教会您很多关于算法及其工作原理的知识。

在这篇文章中，您将学习如何有效地实现机器学习算法以及如何最大限度地从这些项目中学习。

![AdaBoost Algorithm Tutorial for Machine Learning](img/f56bc32deae90901168c0bcfb909b780.jpg)

摄影：Maura McDonnell，保留一些权利。

## 实现机器学习算法的好处

您可以使用机器学习算法的实现作为学习应用机器学习的策略。您还可以在算法实现中开辟一个利基和技能。

### 算法理解

实现机器学习算法将使您对算法的工作方式有深刻而实用的认识。这些知识还可以帮助您通过将向量和矩阵视为数组以及对这些结构进行转换的计算直觉来内化算法的数学描述。

在实现机器学习算法时需要做出许多微决策，并且这些决策通常在正式算法描述中缺失。学习和参数化这些决策可以迅速使您获得对给定方法的中级和高级理解，因为相对较少的人会花时间实现一些更复杂的算法作为学习练习。

## 获取免费算法思维导图

![Machine Learning Algorithms Mind Map](img/2ce1275c2a1cac30a9f4eea6edd42d61.jpg)

方便的机器学习算法思维导图的样本。

我已经创建了一个由类型组织的60多种算法的方便思维导图。

下载，打印并使用它。

### 实用技能

当您手动实现机器学习算法时，您正在开发有价值的技能。诸如掌握算法的技能，可以帮助开发生产系统的技能和可用于该领域的经典研究的技能。

列出的三个技能示例包括：

*   **掌握**：算法的实现是掌握算法的第一步。实现时，您必须非常了解算法。您还可以创建自己的实验室进行修补，以帮助您内化其执行的计算，例如通过调试和添加评估运行过程的措施。
*   **生产系统**：生产系统通常需要自定义算法实现，因为出于效率和效率的原因需要对算法进行更改。更好，更快，更少资源的结果最终可以降低成本并增加业务收入，手动实现算法可帮助您训练提供这些解决方案的技能。
*   **文献综述**：在实现算法时，您正在进行研究。您被迫查找并阅读该算法的多个规范和正式描述。您还可能找到并编写代码审查算法的其他实现，以确认您的理解。您正在进行有针对性的研究，并学习如何阅读和实际使用研究出版物。

## 处理

您可以通过一个过程来加速您从零开始学习和实现机器学习算法的能力。您实现的算法越多，您获得的算法就越快，效率越高，您开发和定制自己的流程的次数就越多。

[![Implement a Machine Leaning Algorithm](img/fad376caf6ed09f82aae89068f0c3fc3.jpg)](https://3qeqpr26caki16dnhd19sv6by6v-wpengine.netdna-ssl.com/wp-content/uploads/2014/01/Implement-a-Machine-Leaning-Algorithm.jpg)

实现机器学习算法
照片由Nic的事件，保留一些权利

您可以使用下面概述的流程。

1.  **选择编程语言**：选择要用于实现的编程语言。此决定可能会影响您可以在实现中使用的API和标准库。
2.  **选择算法**：选择要从零开始实现的算法。要尽可能具体。这不仅意味着算法的类和类型，还包括选择要实现的特定描述或实现。
3.  **选择问题：**选择可用于测试和验证算法实现的规范问题或一组问题。机器学习算法不是孤立存在的。
4.  **研究算法**：找到论文，书籍，网站，库以及您可以阅读和学习的算法的任何其他描述。虽然，理想情况下，您希望对算法的一个关键字描述起作用，但您需要对算法有多个透视图。这很有用，因为多个视角将帮助您更快地内化算法描述，并克服描述中出现的任何歧义或假设的障碍（算法描述中总是存在歧义）。
5.  **单元测试**：为每个函数编写单元测试，甚至从项目开始就考虑测试驱动开发，这样在实现它们之前，您不得不了解每个代码单元的目的和期望。

我强烈建议将算法从一种语言移植到另一种语言，以此作为沿着这条路径快速前进的一种方式。您可以找到许多算法的开源实现，您可以使用其他语言对其进行代码审查，绘图，内化和重新实现。

在开发代码时以及开发代码之后，请考虑开源代码。对它进行评论并确保它提供有关如何构建和使用它的说明。该项目将为您正在开发的技能提供营销，并可能为希望在机器学习中开始的其他人提供灵感和帮助。您甚至可能很幸运地找到了一位对您进行审核或代码审查感兴趣的程序员。你得到的任何反馈都是非常宝贵的（即使是动机），积极寻求它。

## 扩展

实现算法后，您可以探索对实现进行改进。您可以探索的一些改进示例包括：

*   **实验**：您可以将您在算法实现中做出的许多微观决策暴露为参数，并对这些参数的变化进行研究。这可以为您提供可以共享和推广的算法实现的新见解和消歧。
*   **优化**：您可以通过使用工具，库，不同语言，不同数据结构，模式和内部算法来探索提高实现效率的机会。您对经典计算机科学的算法和数据结构的了解对此类工作非常有益。
*   **专业化**：您可以探索使算法更具体针对问题的方法。创建生产系统时可能需要这样做，这是一项宝贵的技能。使算法更具体问题还可以导致效率（例如运行时间）和功效（例如准确度或其他表现测量）的增加。
*   **泛化**：可以通过使特定算法更通用来创建机会。程序员（如数学家）在抽象方面具有独特的技能，您可以看到该算法如何完全应用于一类问题或其他问题的更一般情况。

## 限制

您可以通过手动实现机器学习算法来学习很多东西，但也要记住一些缺点。

*   **冗余**：许多算法已经实现了，一些非常强大的实现已被全球数百或数千名研究人员和从业者使用。您的实现可能被视为多余的，社区已投入的重复工作。
*   **Bugs** ：即使是熟练的程序员和单元测试，用户很少的新代码也更容易出错。使用标准库可以降低算法实现中出现错误的可能性。
*   **非直观的飞跃**：由于涉及复杂的数学，一些算法依赖于推理或逻辑中的非直观跳跃。不理解这些跳跃的实现是有限的，甚至是不正确的。

很容易评论机器学习算法的开源实现，并在代码审查中引发许多问题。要理解在实现中编码的非直观效率要困难得多。这可能是思考的陷阱。

您可能会发现，在考虑如何将其更改为在程序上不那么优雅但计算效率更高的情况下，从复杂算法的较慢直观实现开始是有益的。

## 示例项目

有些算法比其他算法更容易理解。在这篇文章中，我想为直观算法提出一些建议，您可以从中选择第一个从零开始实现的机器学习算法。

*   **普通最小二乘线性回归**：使用二维数据集和y中的模型x。为算法的每次迭代打印出错误。考虑为算法的每次迭代绘制最佳拟合线和预测线，以查看更新如何影响模型。
*   **k-最近邻**：考虑使用具有2个类的二维数据集，甚至是使用方格纸创建的两个类，以便您可以绘制它们。一旦您可以绘制并做出预测，您就可以绘制为模型所做的每个预测决策创建的关系。
*   **Perceptron** ：被认为是最简单的人工神经网络模型，与回归模型非常相似。您可以在学习数据集时跟踪和绘制模型的表现。

## 摘要

在这篇文章中，您了解了手动实现机器学习算法的好处。您了解到，通过遵循此路径，您可以了解算法，进行改进并训练宝贵的技能。

您学习了一个简单的过程，您可以在从零开始实现多个算法时遵循和自定义，并且您学习了三种算法，您可以选择这些算法作为从零开始实现的第一个算法。