编写基于机器学习的程序，有哪些编写和调试的经验和窍门？
作为一个纯做机器学习，主要搞probabilistic graphical model的苦逼Ph.D，大多数时间实际上是在推公式好吧摔！！！anyway，说说自己编写、调试机器学习程序的经验吧。 1，要用print ！ 大多数机器学习方法是优化问题，一般是迭代求解，算法一般就是gradient descent的各种变种。自己编写的时候，尽量打印每轮迭代时model的信息，包括目标函数值、训练数据上的错误率，甚至测试数据上的错误率，probabilistic model经常打印log-likelihood。举个栗子，如果迭代中，目标函数值增加了（diverge 了），先检查是否是learning rate设的过大（最常见），gradient的正负搞反了（也很常见。。），如果不是，基本就要断点调试了。再比如，如果训练错误率一直在下降，测试错误率开始上升，那就是过拟合了。 2，先在toy/simulated的data上测试通过 real data一般有不少预处理的问题，数据本身也有很多不符合模型假设的“个性”，很多时候，会影响你对机器学习模型、算法本身正确性的判断。最重要的，这样调试大大节省了时间。 3，不要吝啬注释 机器学习核心算法的程序，通常非常短小，但是如果没有注释，可读性会很差。因为代码背后是公式。对绝大多数凡人来说，公式本身就已晦涩，从代码里面读出公式，搞清楚程序在干吗，更是坑爹。所以，为了自己跟他人的身心健康，请加注释。 4，如果专注机器学习算法本身，复用别人的代码要慎重。 当你自己提了一个模型、算法，想投NIPS、ICML、AIStats、UAI，需要对比前人的算法时，如果不是特别难，建议自己动手实现前人的方法（实际上，这是当年老板给我的忠告）。。首先，如果你只是把别人的代码当做一个黑盒子，很难得到自己的方法为啥好，别人的方法为啥差的insight，如果不幸自己的方法差，也很难找到改进自己方法的窍门。再者，最新提出的方法，一般没有可用的高质量代码。注意！！如果你的主要目标不是提出新的算法，而是想在某个应用上做出好的正确率，那么按 说的，尽可能复用别人的代码。 5，先编写简单的机器学习算法练手 比如logistic regression, 比如EM for Gaussian Mixture, 比如SVM。先用最简单的实现。logistic regression就用gradient descent，linear svm就用sub-gradient decent。加了各种kernel的svm就用naive的quadratic  programming，熟悉一些了，也可以用SMO。磨刀不误砍柴工，能学到很多。 6, 机器学习程序中的小bug很难发现 难发现的原因在于，有小bug的程序工作的很好，没有任何错误的征兆~~甚至有些时候，带小bug的程序，会比没bug的程序得到的正确率更高...（有多年ML经验的人，肯定遇到过这样的情况）。原因是小bug会起到某种regularization的作用，防止了过拟合。所以尽人力后，顺其自然吧。。。 p.s.题外话，这个现象曾在12年NIPS的时候，被一个机器学习的大牛Dietterich拿来调侃巨牛Hinton提出的dropout方法。Hinton当时说，如果我的方法work得好，是因为有bug，那一定是世上最好的bug~~因为我的程序总是在赢各种竞赛。。