ML-From-Scratch
用纯NumPy从零实现全部主流ML算法,没有PyTorch/TensorFlow黑箱,3万星机器学习教育标杆项目
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
用纯NumPy从零实现全部主流ML算法,没有PyTorch/TensorFlow黑箱,3万星机器学习教育标杆项目
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样一个场景:你在网上学了一门机器学习课,翻完了吴恩达的课件,刷完了Kaggle的入门题,自认为对ML略懂。然后某天面试官问了一句:反向传播的梯度是怎么从输出层传回来的?链式法则具体怎么写?
你沉默了。
这就是ML-From-Scratch想解决的问题——让你真正懂机器学习,而不是只会调库。
ML-From-Scratch由瑞典机器学习工程师Erik Linder-Noren于2017年创建,项目名直接呼应了那本经典的Neural Networks and Deep Learning。作者的核心哲学在README里写得明明白白:
"The purpose of this project is not to produce as optimized and computationally efficient algorithms as possible but rather to present the inner workings of them in a transparent and accessible way."
翻译过来就是:这个项目不在乎你用PyTorch能跑多快,而在乎你能不能看清每个算法的内部齿轮是怎么转的。 截至目前,该项目已获得超过31,000颗GitHub星,5,200多次Fork,是机器学习教育领域最受认可的手写实现类项目之一。作者Erik Linder-Noren后来还创建了PyTorch-YOLOv3、Keras-GAN等知名项目,是真正活跃在一线的开源贡献者。
市面上的ML框架(PyTorch、TensorFlow)就像是你买回来的乐高城市套装——拼好一辆消防车只需要三步:import模型,喂数据,等结果。但你永远不知道轮胎为什么是圆的、发动机为什么能动。
ML-From-Scratch则是乐高的基础砖块包。给你的只有最原始的凸起和凹槽,但你最终能造出任何你想要的东西——不只是说明书里的那辆消防车。
具体来说,它用NumPy(一个Python数值计算库,本质上就是带数学函数的科学计算器)重新实现了从线性回归到GAN的几乎所有主流ML算法。没有PyTorch,没有TensorFlow,没有任何黑箱。
ML-From-Scratch的内容体系极为完整,分为四大模块:
从最简单的感知机(Perceptron)到复杂一点的XGBoost梯度提升,覆盖了经典ML的几乎所有核心算法。每一种算法都有对应的示例脚本,直接运行就能看到效果。
这是项目最硬核的部分——作者用NumPy手写了一个完整的神经网络框架,包括:
每个算法都配有对应的示例脚本:
polynomial_regression.py——多项式回归训练过程可视化convolutional_neural_network.py——在8×8小图上训练CNN,附完整层参数表generative_adversarial_network.py——GAN生成MNIST手写数字restricted_boltzmann_machine.py——RBM重构MNIST图片recurrent_neural_network.py——RNN处理序列数据genetic_algorithm.py——遗传算法求解TSP旅行商问题deep_q_network.py——DQN玩CartPole平衡游戏图1展示了多项式回归的训练过程gif动画,可以看到模型逐步拟合瑞典Linköping地区2016年的温度数据:

图1:多项式回归训练过程——正则化防止过拟合,曲线从欠拟合逐步过渡到最优拟合
ML-From-Scratch的依赖极其精简:
numpy # 数值计算,ML的底层引擎
scipy # 科学计算(积分、插值等),SVM求解器cvxopt依赖它
matplotlib # 绑图,所有训练过程的可视化都靠它
pandas # 数据处理,示例脚本中的数据加载
cvxopt # 凸优化求解器,SVM的内核
sklearn # 仅用于数据划分(train_test_split)和指标计算
progressbar33 # 训练进度条
gym # 强化学习环境接口
整个项目的核心代码不超过20000行。相比之下,PyTorch的torch/nn目录本身就超过15万行代码。但正是这种精简,让你能用python mlfromscratch/examples/polynomial_regression.py直接跑起来,然后在IDE里F5逐步调试——这是任何框架都做不到的学习体验。
代码质量上,项目有MIT许可证,目录结构清晰(按监督/无监督/深度学习/强化学习分类),每个算法文件都有docstring注释,README中的数学公式配有ASCII表格和图示。唯一的不足是没有自动化测试套件(requirements.txt里没有pytest),这在生产级代码中是个隐患。
ML-From-Scratch是一个纯教学工具包,不支持Docker部署,也没有Web界面。
安装方式极为简单,两步搞定:
git clone https://github.com/eriklindernoren/ML-From-Scratch
cd ML-From-Scratch
python setup.py install
或者一行pip:
pip install mlfromscratch
硬件需求几乎为零——纯NumPy计算,不需要GPU,2GB内存足矣。整个项目代码约200MB磁盘空间,但实际Python包只有几十MB。
上手建议路线:
polynomial_regression.py),看效果ML-From-Scratch不适合所有人,也有一些公认的局限:
1. 无法用于生产 NumPy实现的算法没有GPU加速、没有自动微分、没有分布式训练,拿去跑真实业务场景是自讨苦吃。项目的定位始终是学习工具而非生产工具。
2. PyTorch比从零手写更值得? 有人认为直接读PyTorch源码更实用——既能看到工程化实现,又能学到框架设计思路。这个观点有一定道理,但ML-From-Scratch的优势在于更纯粹的数学表达,没有框架的API干扰。
3. 部分算法实现较早期 项目最后一次大更新在2020年前后,部分实现(如BatchNormalization)没有跟进后来的一些最佳实践。
4. 没有测试覆盖 缺少单元测试意味着代码重构风险较高。fork这个项目做修改时需要格外小心。
ML-From-Scratch的存在证明了一件事:在AI工具越来越傻瓜化的今天,知其所以然依然有不可替代的价值。
随着AutoML、Hugging Face、PyTorch Lightning等工具越来越强大,一个初级ML工程师可能3个月都接触不到一次梯度计算的具体实现。但当模型效果不好需要debug时,当需要针对特定场景定制损失函数时,当面试官问起注意力机制的复杂度时——没有从零理解过ML的人会立刻露馅。
ML-From-Scratch填补的正是这个认知空白。3万颗星不是偶然,它代表的是一批真正想懂AI、而不是只会用AI的学习者和工程师的集体选择。在AI教育从调库向理解回归的大趋势下,这个项目的价值只会被越来越多的人认识到。