教你6步从头写机器学习算法——以感知机算法为例

1,711 阅读5分钟

自己从头写一个算法,不仅能给你带来成就感,也能帮你真正理解算法的原理。可能你之前用 Scikit-learn 实现过算法,但是从零开始写个算法简单吗?绝对不简单。


有些算法要比其它算法复杂的多,所以在写算法时可以先从简单的开始,比如单层的感知机。


下面就介绍机器学家 John Sullivan 总结出的 6 个步骤,以感知机算法为例,教你从头开始写出一个机器学习算法。文中的方法论同样能应用到其它机器学习算法上。这 6 个步骤是:

  • 对算法有个基本的了解
  • 寻找实用的学习资源
  • 把算法拆成几个部分
  • 以一个简单的例子开始
  • 使用可靠的实现进行验证
  • 整理出写算法的过程


对算法有个基本的了解


如果你不了解算法的基本知识,先不要尝试从头写算法。至少。你应该能回答以下问题:


  • 算法的含义?
  • 它通常用来干吗?
  • 什么时候不能用它?


以感知机为例,我们试着回答这些问题:

单层感知机是最简单的神经网络,通常用于二元分类问题(1或0,“是”或“否”)。

它相当于一个二元分类器,所以只有出现线性决策边界时才会用到它。还有些简单的用途,比如情感分析(正面或负面回应)或贷款违约预测(会违约,不会违约)。在这两类用途中,决策边界都需要是线性的。


如果决策边界是非线性的,那么就不能使用感知机。对于这类问题,需要使用其它算法。



寻找一些学习资源


在对算法有个基本的理解后,就可以开始做点研究了。建议多用一些不同的资源,有些人看书学得快,有些是看视频学得快。学习感知机知识,这里有一些不错的资源:


  • 书本:

《统计学习精要》:

web.stanford.edu/~hastie/Pap…


《Understanding Machine Learning: From Theory To Algorithms》:

www.cs.huji.ac.il/~shais/Unde…


  • 博客:

John Brownslee 写的这篇《用 Python 从头实现感知机算法》:

machinelearningmastery.com/implement-p…


Sebastian Raschka 的博客《单层神经网络与梯度下降》:

sebastianraschka.com/Articles/20…


  • 视频:

感知机算法训练:

www.youtube.com/watch?v=5g0…


感知机算法工作原理:

www.youtube.com/watch?v=1Xk…


把算法拆成几部分

等收集好资源后,就开始学习了。首先准备好纸笔,我们不是通读整个章节或整篇博客,而是略读章节标题和其它一些重要信息。写下内容要点,试着概述算法。


在看完学习资料后,我们将感知机算法拆成以下几个部分:


  • 初始化权重
  • 将权重和输入相乘,并求和
  • 将结果和阙值进行比较,以计算输出(1或0)
  • 更新权重
  • 重复


像这样将算法拆成几个部分,学起来会更容易。基本上我们先以伪代码概述算法,再回头填补细节。下图是第二步时John Sullivan所做的笔记,即权重和输入的点积:



以一个简单的例子开始


整理好算法的笔记后,开始用代码实现。在深入研究一个复杂的问题之前,建议先从一个简单的例子开始。对于感知机来说,与非门(NAND gate)是一个完美的简单数据集。如果两个输入都为真(1)则输出为假(0),否则输出为真。以下是数据集的示例:



现在使用一个简单的数据集,开始实现我们在步骤 3 中概述的算法。最好以块的方式写算法,并进行测试,不要试图一次性写完。这样你在刚开始时更容易调试。当然最后可以回去整理一下,使代码看起来更整洁一些。


下面是在第 3 步中算法的点积部分的 Python 代码:



使用可靠的实现进行验证


等写完代码并用小数据集测试以后,接下来尝试较大的数据集。为了确保代码能在更复杂的数据集上正确运行,最好用可靠的实现进行测试。对于感知机来说,我们可以用 Scikit-learn 中的实现。



测试代码时需要查看权重。如果正确地实现了算法,权重应该与 scikit-learn 感知机的权重相匹配。



如果最开始没有得到相同的权重,那么就需要调整 scikit-learn 感知机中的默认设置。如果每次都实现一个新的随机状态,只是一个固定的种子,那么就必须关闭它。在 Jason Sullivan 自己的实践操作中,为了匹配学习率,他将 eta0 改为 0.1。最后,他关闭了 fit_intercept 选项,在特征数据集中包含了一个 1 的虚拟列,所以已经自动拟合了截距(也就是偏置项)。


这就给我们一个很重要的启示。在验证模型的现有实现时,你需要非常了解模型的输入。永远不应盲目地使用模型,要始终对你的假设以及每个输入的确切含义保持怀疑。


整理出写算法的过程

过程的最后一步可能是最重要的,前面完成学习、做笔记、写算法以及将结果和可靠实现比较等这几个步骤后,最后把这个过程整理出来很重要,有两个原因:

  1. 随着你向别人展示自己所学的东西,你会对算法有更深入的理解;
  2. 可以作为一项成果,展示给潜在的雇主,作为求职的加分项。使用机器学习库实现一个算法是一回事,自己从头开始写出一个算法是另一回事,而后者给人留下的印象更深刻。


以上就是从头开始实现一个机器学习算法的 6 个步骤,刚开始最好先从简单的算法开始,熟练这套方法论后再扩展到其它更复杂的算法上。


参考资料:
www.kdnuggets.com/2018/09/6-s…

我们的新课程平台,欢迎试用:jizhi.ai/