本身从头写一个算法,不只能给你带来成就感,也能帮你真正理解算法的原理。可能你以前用 Scikit-learn 实现过算法,可是从零开始写个算法简单吗?绝对不简单。html
有些算法要比其它算法复杂的多,因此在写算法时能够先从简单的开始,好比单层的感知机。python
下面就介绍机器学家 John Sullivan 总结出的 6 个步骤,以感知机算法为例,教你从头开始写出一个机器学习算法。文中的方法论一样能应用到其它机器学习算法上。这 6 个步骤是:web
对算法有个基本的了解算法
若是你不了解算法的基本知识,先不要尝试从头写算法。至少。你应该能回答如下问题:网络
以感知机为例,咱们试着回答这些问题:机器学习
单层感知机是最简单的神经网络,一般用于二元分类问题(1或0,“是”或“否”)。学习
它至关于一个二元分类器,因此只有出现线性决策边界时才会用到它。还有些简单的用途,好比情感分析(正面或负面回应)或贷款违约预测(会违约,不会违约)。在这两类用途中,决策边界都须要是线性的。测试
若是决策边界是非线性的,那么就不能使用感知机。对于这类问题,须要使用其它算法。3d
寻找一些学习资源调试
在对算法有个基本的理解后,就能够开始作点研究了。建议多用一些不一样的资源,有些人看书学得快,有些是看视频学得快。学习感知机知识,这里有一些不错的资源:
《统计学习精要》:
《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…
感知机算法训练:
感知机算法工做原理:
把算法拆成几部分
等收集好资源后,就开始学习了。首先准备好纸笔,咱们不是通读整个章节或整篇博客,而是略读章节标题和其它一些重要信息。写下内容要点,试着概述算法。
在看完学习资料后,咱们将感知机算法拆成如下几个部分:
像这样将算法拆成几个部分,学起来会更容易。基本上咱们先以伪代码概述算法,再回头填补细节。下图是第二步时John Sullivan所作的笔记,即权重和输入的点积:
以一个简单的例子开始
整理好算法的笔记后,开始用代码实现。在深刻研究一个复杂的问题以前,建议先从一个简单的例子开始。对于感知机来讲,与非门(NAND gate)是一个完美的简单数据集。若是两个输入都为真(1)则输出为假(0),不然输出为真。如下是数据集的示例:
如今使用一个简单的数据集,开始实现咱们在步骤 3 中概述的算法。最好以块的方式写算法,并进行测试,不要试图一次性写完。这样你在刚开始时更容易调试。固然最后能够回去整理一下,使代码看起来更整洁一些。
下面是在第 3 步中算法的点积部分的 Python 代码:
使用可靠的实现进行验证
等写完代码并用小数据集测试之后,接下来尝试较大的数据集。为了确保代码能在更复杂的数据集上正确运行,最好用可靠的实现进行测试。对于感知机来讲,咱们能够用 Scikit-learn 中的实现。
测试代码时须要查看权重。若是正确地实现了算法,权重应该与 scikit-learn 感知机的权重相匹配。
若是最开始没有获得相同的权重,那么就须要调整 scikit-learn 感知机中的默认设置。若是每次都实现一个新的随机状态,只是一个固定的种子,那么就必须关闭它。在 Jason Sullivan 本身的实践操做中,为了匹配学习率,他将 eta0 改成 0.1。最后,他关闭了 fit_intercept 选项,在特征数据集中包含了一个 1 的虚拟列,因此已经自动拟合了截距(也就是偏置项)。
这就给咱们一个很重要的启示。在验证模型的现有实现时,你须要很是了解模型的输入。永远不该盲目地使用模型,要始终对你的假设以及每一个输入的确切含义保持怀疑。
整理出写算法的过程
过程的最后一步多是最重要的,前面完成学习、作笔记、写算法以及将结果和可靠实现比较等这几个步骤后,最后把这个过程整理出来很重要,有两个缘由:
以上就是从头开始实现一个机器学习算法的 6 个步骤,刚开始最好先从简单的算法开始,熟练这套方法论后再扩展到其它更复杂的算法上。
参考资料:
www.kdnuggets.com/2018/09/6-s…
咱们的新课程平台,欢迎试用:jizhi.ai/