☰
ML-From-Scratch:用 NumPy 手写 36 个机器学习算法的透明实现
2026/10/5 21:54:38 网站建设 项目流程

ML-From-Scratch:用 NumPy 手写 36 个机器学习算法的透明实现

【免费下载链接】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

当你在 sklearn 里调用fit()之后看不到梯度下降到底怎么走、反向传播里每个偏导数怎么推,可以翻 ML-From-Scratch——一个用纯 NumPy 手写的机器学习算法库,从线性回归到 GAN 的 36 个实现全部可读,每一行矩阵运算都能被断点跟踪。

📊 依赖 NumPy 的 36 个算法,作者声明不追求性能

作者在 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."(这个项目不追求性能,只追求透明。)

翻开仓库目录能数清楚:mlfromscratch/supervised_learning/下 21 个分类与回归模型、mlfromscratch/unsupervised_learning/下 11 个无监督算法、mlfromscratch/reinforcement_learning/下 1 个 Deep Q-Network、mlfromscratch/deep_learning/下 14 种可组合 Layer(Dense、Conv2D、Dropout、BatchNorm、Pooling 等)与 3 种网络(CNN、MLP、RNN),合计 36 个算法实现加 14 种 Layer。依赖清单(requirements.txt)只有 9 项:matplotlib、numpy、sklearn、pandas、cvxopt、scipy、progressbar33、terminaltables、gym,其中 8 项只用于数据加载或画训练曲线,核心算法完全绕开 PyTorch 与 TensorFlow,矩阵运算全部是 NumPy 的.dot与切片。

"透明"这个定位,正是它和商用框架的差异——你不需要在这里学 API,你需要在这里看实现。

⚙️ 梯度下降、反向传播与 Layer 抽象怎么拆

整个库的架构一句话:每个算法一个类,每个类只依赖 NumPy 与mlfromscratch/utils/里的数据工具;反向传播和 Layer 抽象在deep_learning/下独立成型,可以脱离上面的分类/回归模型单独使用。

回归模型如何把梯度下降摊开

Regression是 Linear、Ridge、Lasso、Elastic Net、Polynomial 五种回归模型的公共基类,权重更新循环只有五行核心逻辑:

# mlfromscratch/supervised_learning/regression.py for i in range(self.n_iterations): y_pred = X.dot(self.w) # 前向预测 mse = np.mean(0.5 * (y - y_pred) ** 2) # l2 损失 grad_w = -(y - y_pred).dot(X) # 损失对 w 的偏导 self.w -= self.learning_rate * grad_w # 沿梯度反方向更新

五种回归的差异全部收敛到regularization属性:L1 用np.linalg.norm(w)、L2 用w.T.dot(w)、Elastic Net 是两者的加权和,每个正则化类不到 10 行。读这段代码只需要会矩阵乘法,不需要框架背景。这也是为什么 examples/polynomial_regression.py 能直接用温度数据画出一条正弦近似曲线——没有黑盒,你看到的就是训练本身。

反向传播被拆成两个方法

NeuralNetwork把训练循环抽象成fit → train_on_batch → (_forward_pass, _backward_pass)三层:

# mlfromscratch/deep_learning/neural_network.py def train_on_batch(self, X, y): y_pred = self._forward_pass(X) # 逐层前向 loss_grad = self.loss_function.gradient(y, y_pred) # 损失对输出的偏导 self._backward_pass(loss_grad) # 反向传播 + 权重更新 return np.mean(self.loss_function.loss(y, y_pred))

_forward_pass只做for layer in self.layers: layer.forward_pass(...),_backward_pass用reversed(self.layers)从最后一层回传。这种"每层只算自己那段偏导"的写法跟 PyTorchautograd思路一致,但没有自动微分——每一层的求导公式得你自己在backward_pass里写出来,这恰恰是理解反向传播最快的路径。想加 Dropout 或 BatchNorm?在NeuralNetwork上nn.add(BatchNormalization())就行,跟 Keras 的Model.add()语法一致,但每个 Layer 的backward_pass实现都得自己读一遍。

Layer 抽象:Dense 的 forward 与 backward 各五行

# mlfromscratch/deep_learning/layers.py def forward_pass(self, X, training=True): self.layer_input = X return X.dot(self.W) + self.w0 # 全连接 = 矩阵乘 + 偏置 def backward_pass(self, accum_grad): grad_w = self.layer_input.T.dot(accum_grad) # 对 W 求导 self.W = self.W_opt.update(self.W, grad_w) # 交给优化器更新

Conv2D、Pooling、BatchNorm都继承同一个Layer基类,对外接口就forward_pass/backward_pass/output_shape三个方法,summary()会自动打印每层参数量(见 layers.py)。optimizer也是同一套抽象——optimizers.py 里的StochasticGradientDescent、NesterovAcceleratedGradient、Adagrad、Adam都是"接收权重与梯度、返回新权重"的三行方法。想加自定义层,照 Dense 抄一遍即可。

🚀 安装命令三步跑通第一个示例

git clone https://gitcode.com/GitHub_Trending/ml/ML-From-Scratch cd ML-From-Scratch && pip install -r requirements.txt && python setup.py install python mlfromscratch/examples/polynomial_regression.py

示例用 mlfromscratch/data/TempLinkoping2016.txt 里瑞典 Linöping 2016 年逐日温度数据拟合一条周期曲线,跑完会打印训练误差下降曲线。生产环境别用它跑模型——README 明确声明目标不是计算效率;把它当作可读的参考实现,在生产项目里用 PyTorch 复现同样的数学公式,才是合理分工。

⚠️ 什么时候用 PyTorch 什么时候用它

  • 性能:fit循环是纯 Python for 循环,无 GPU 加速,百万级样本训练会明显慢于 sklearn 或 PyTorch,作者也明确说了不追求效率。
  • 模型覆盖:强化学习只有 DQN 一个,无监督里没有图神经网络,requirements.txt里的gym是 2017 年版本 API,跑新环境需要自己适配。
  • 数据:仓库里只内置了 data/TempLinkoping2016.txt 一份温度数据,其他示例都依赖sklearn.datasets的内置数据集。
  • 维护节奏:setup.py 里版本号停在 0.0.4,作者以个人项目方式维护,不是组织化开源项目。
  • 与同类开源对比:d2l、fast.ai 这类教材项目也讲实现,但它们围绕"课程"组织代码;ML-From-Scratch 是围绕"可 import 的类"组织,每个算法都是一个能直接from mlfromscratch.supervised_learning import KNN拿到的实现。
  • 与商用框架对比:在"我需要可解释的训练过程"场景下比 PyTorch 更适合;在"我需要跑大模型"场景下更适合 PyTorch。两者不是替代关系,是分层关系——这里负责让你看懂数学,商用框架负责让你跑起来。

下一步

从 mlfromscratch/examples/linear_regression.py 开始跑一遍,读完 regression.py 的fit方法,再对照 PyTorch 里的nn.Linear反向推一遍——这是这个项目能给你的最短路径。

【免费下载链接】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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询