ML-From-Scratch:22 个经典算法的 NumPy 级源码解剖
【免费下载链接】ML-From-ScratchMachine Learning From Scratch. Bare bones NumPy implementations of machine learning models and algorithms with a focus on accessibility. Aims to cover everything from linear regression to deep learning.项目地址: https://gitcode.com/GitHub_Trending/ml/ML-From-Scratch
团队里来了个新人,问 SVM 的核技巧到底怎么进 loss 函数。翻文档?公式太抽象。翻 scikit-learn?源码藏在优化器的抽象层后面,越读越晕。这种"知道原理但没见过实现"的断层,每个 ML 团队都会撞上。
于是我们开始用 ML-From-Scratch 当教材:这个仓库只用 NumPy 重写了 22 种监督学习算法(外加 11 种无监督算法),梯度、核函数、剪枝、动量全部手写,代码量克制到可以直接当本地部署的学习型代码库来逐行读。
定位:一份能跑通的算法解剖图鉴
一句话定义:它不是生产框架,而是一套"可运行的教材"——README 开头就明说,目标不是极致性能,而是把内部机制透明地摊开。
两个最硬的数字:
- 全仓库 82 个 Python 文件、约 6900 行代码(平均每套算法不到 300 行,读得完)
- 核心训练依赖只有 NumPy 一个(sklearn 只出现在示例里加载数据集,gym 只服务 DQN 那个例程)
它解决的其实是"团队知识库缺失":新人不用背文档,直接断点调试。
技术拆解:它凭什么只用 NumPy 做到
回归全家桶共享同一个梯度下降骨架
regression.py 里,线性、Ridge、Lasso、Elastic Net、多项式回归共用一个基类:fit() 就是一个 for 循环,y_pred = X.dot(w)前向、负梯度更新权重,每一步都看得见。正则项被做成独立的 l1/l2/l1_l2 类,各带grad()方法,插进基类即用——想加 L3 正则?自己写个类插进去就行。效果是把"正则化到底改了哪一行"这种问题变成了三行 diff。
手写反向传播 + 六大优化器
deep_learning 模块 复刻了 Keras 的 API 心智:network.add(Dense(...))、fit(X, y, n_epochs, batch_size)。但train_on_batch内部只有四步:前向、算 loss、对 y_pred 求梯度、逆序遍历层做反向传播(neural_network.py 全文 123 行)。optimizers.py 把 SGD、Nesterov、Adagrad、Adadelta、RMSprop、Adam 各写了 20 行左右——Adam 的偏差修正那两行m_hat / v_hat,在教科书里永远只给公式,这里给的是代码。效果:新人第一次看到"动量项到底怎么参与更新",不是靠想象。
二阶梯度树的完整移植
XGBoost 实现 没有偷懒只写一阶梯度,而是老老实实实现了 LogisticLoss 的 loss、gradient 和 hess 三个函数,树按二阶信息生长。decision_tree.py 里还有基于 CART 的剪枝——这是"最小教学实现"里很少见的部分。效果:拿它和 sklearn 的 XGBRegressor 在同一数据集上对曲线,学生能亲眼看到"二阶项为什么让树更稳"。
连 CNN 的卷积核都是显式循环
layers.py 的 Conv2D 没有 einsum 技巧、没有 C 扩展,就是四层 for 循环滑动窗口。官方示例用它在 MNIST 二分类上训出 98.75% 准确率、全程 1 分 55 秒(约 54 万参数,CPU 可跑)。这种"慢但可读"的取舍,正是整个仓库的设计动机:先理解,再谈快。
最短上手路径
三步跑通,全程不需要 GPU:
git clone https://link.gitcode.com/i/497309cc27831056f94f150efc1eeded cd ML-From-Scratch && pip install -r requirements.txt python mlfromscratch/examples/decision_tree_classifier.py跑 demo.py 可以一次对比 12 个模型:
from mlfromscratch.supervised_learning import RandomForest from mlfromscratch.utils import train_test_split clf = RandomForest(n_estimators=50) X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.5) clf.fit(X_tr, y_tr) pred = clf.predict(X_te)| 档位 | 配置 | 说明 |
|---|---|---|
| 最低要求 | Python 3.6+、NumPy、sklearn | 跑通 demo.py 和全部监督/无监督算法 |
| 推荐配置 | 8GB 内存、16 核以上 CPU、gym | CNN 示例 2 分钟训完;DQN 示例可完整跑 |
适用边界:谁该拿它,谁别拿
适合:算法岗面试前做代码级复习;带新人时当"活文档";教学场景做断点调试。不适合任何生产链路——没有 batching 之外的性能工程,SVM 的核矩阵、DBSCAN 的邻居搜索都是朴素 Python 循环,万行以上数据会很慢。
三个判断信号:
- 若你要上线模型或需要 GPU 吞吐,选 PyTorch/TF 生态,它连 CUDA 的接口面都没有;
- 若你的目标只是调参出结果,sklearn 半小时的事,这里要自己拼 pipeline,投入产出比倒挂;
- 若团队缺的是"读过一遍核心算法"的人,它性价比很高——因为每个模型都是 100–300 行,一次 code review 就能覆盖。
说白了,它的价值不在"能用",在"能读懂"。
给决策者的下一步
花一个下午做三件事:让一位新人 clone 下来断点走完一个模型(比如 SVM 的核矩阵),评估学习曲线;挑一个内部历史问题(比如为什么 Lasso 的系数会稀疏),让团队对着 l1 正则的 grad 实现讨论一遍;最后给仓库定个使用纪律——只许读,不许在生产 import。别指望它替代任何生产组件,但值得让团队里每个写模型的人都亲手读一遍它的 Adam 和 XGBoost,再回到 PyTorch 里写生产代码。
【免费下载链接】ML-From-ScratchMachine Learning From Scratch. Bare bones NumPy implementations of machine learning models and algorithms with a focus on accessibility. Aims to cover everything from linear regression to deep learning.项目地址: https://gitcode.com/GitHub_Trending/ml/ML-From-Scratch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考