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

自己从头写一个算法,不仅能给你带来成就感,也能帮你真正理解算法的原理。可能你之前用 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. 随着你向别人展示自己所学的东西,你会对算法有更深入的理解;

 

    1. 可以作为一项成果,展示给潜在的雇主,作为求职的加分项。使用机器学习库实现一个算法是一回事,自己从头开始写出一个算法是另一回事,而后者给人留下的印象更深刻。

 

 

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

 

参考资料:

www.kdnuggets.com/2018/09/6-s…

发表评论

电子邮件地址不会被公开。 必填项已用*标注