- 机器学习
- 深度学习
【免费下载链接】PRML
PRML algorithms implemented in Python
本指南以仓库根目录的 README.md 为骨架,系统介绍 PRML 项目的定位、依赖环境、安装方式、13 章 Notebook 资源,并深入其prml/源码包,梳理线性模型、概率分布、核方法、隐马尔可夫模型、神经网络、采样与图模型等模块的实现细节与测试验证方式。读完本文,你将掌握如何在本仓库中快速搭建运行环境、按章节查阅示例,并能够基于源码地图定位任意算法(如贝叶斯回归、高斯过程、Kalman 滤波、PCA)的准确实现文件,从而将教材公式与可运行代码一一对应。
1. 项目概览:教材算法的一站式 Python 实现
PRML 是一个纯 Python 实现的算法库,其目标正如 README.md 开头所述:"Python codes implementing algorithms described in Bishop's book 'Pattern Recognition and Machine Learning'"——即完整复现 Christopher Bishop 经典教材《模式识别与机器学习》(Pattern Recognition and Machine Learning)中的算法。
从源码结构看,整个项目由两大部分组成:
notebooks/:按教材章节组织的 Jupyter Notebook,共 13 个,对应教材 ch01 至 ch13,是学习和演示算法效果的主入口;prml/:核心 Python 算法包,内含 9 个功能子模块;test/:单元测试目录,用于验证关键算法的数值正确性。
其中prml包的顶层入口在 prml/init.py,它一次性导出 9 个子模块,构成完整的能力面:
| 子模块 | 功能主题 | 对应教材章节方向 |
|---|---|---|
prml.linear | 线性回归与线性分类模型 | ch03、ch04 |
prml.rv | 随机变量与概率分布 | ch02 |
prml.clustering | 聚类(K-Means 等) | ch09 |
prml.kernel | 核方法与稀疏核机 | ch06、ch07 |
prml.markov | HMM、Kalman 滤波与粒子滤波 | ch13 |
prml.dimreduction | PCA、贝叶斯 PCA、自编码器 | ch12 |
prml.sampling | 采样方法 | ch11 |
prml.nn | 自研神经网络自动微分框架 | ch05 |
prml.bayesnet | 图模型与信念传播 | ch08 |
2. 依赖环境与版本要求
2.1 README 声明的依赖清单
README.md 中明确列出了运行本项目所需的第三方包:
| 依赖包 | 说明 |
|---|---|
python 3 | 基础运行环境 |
numpy | 数值计算核心 |
scipy | 科学计算(如距离矩阵计算) |
jupyter | 可选,用于运行 Notebook |
matplotlib | 可选,用于在 Notebook 中绘制结果图 |
sklearn | 可选,用于获取数据集 |
2.2 源码中更精确的版本约束
结合仓库实际配置文件,可以进一步确认版本约束:
- setup.py 声明
python_requires=">=3.9",install_requires=["numpy>=2", "scipy"],即运行prml包本体只需要Python 3.9+、NumPy 2.x 与 SciPy,说明基础算法实现并不强制依赖 sklearn 等可选包; - environment.yaml(conda 环境定义)则给出了一个更完整的开发环境,包含
numpy、pandas、scipy、scikit-learn、matplotlib、ipykernel与ffmpeg; - setup.cfg 的
options.extras_require定义了develop开发模式依赖,包括jupyter、matplotlib、pandas、scikit-learn、pre-commit以及autopep8、flake8等代码质量工具。
需要说明的是:numpy>=2是该仓库当前 setup.py 中的实际约束,若你的环境中 NumPy 版本低于 2.x,安装时需按提示升级。
3. 安装与运行:从零搭建运行环境
README.md 提供了面向 Amazon SageMaker Studio Lab 的标准安装流程。这套命令同样适用于本地 conda 环境:
conda env create -f environment.yaml # 创建名为 prml 的 conda 环境(可能在部分环境可省略) conda activate prml # 激活环境 python setup.py install # 安装 prml 包其中 environment.yaml 头部注释也给出了同样的三步操作指引。执行完成后,即可在任意 Python 进程中import prml。
如果采用 pip 工作流,也可基于 setup.py 直接安装包本体:
pip install numpy>=2 scipy # 安装运行时依赖 pip install -e . # 可编辑模式安装 prml(便于直接阅读/修改源码)若要使用开发模式(含 Notebook 与代码质量工具),可参考 setup.cfg 的 extras 配置:
pip install -e ".[develop]"提示:仓库是只读的,上述命令仅用于在本地查看、安装与运行,不应作为修改仓库内容的过程。
4. 章节 Notebook 速查:13 章示例一览
README.md 的核心内容之一是一张 13 章 Notebook 速查表。所有 Notebook 均位于 notebooks/ 目录,文件名与教材章节一一对应,可通过 nbviewer 等工具在线渲染,也可以直接导入 Amazon SageMaker Studio Lab(AWS 提供的免费计算环境,使用前需先以邮箱注册并完成 onboarding)运行。
| 章节主题 | Notebook 文件 |
|---|---|
| ch1. Introduction(绪论) | ch01_Introduction.ipynb |
| ch2. Probability Distributions(概率分布) | ch02_Probability_Distributions.ipynb |
| ch3. Linear Models for Regression(线性回归模型) | ch03_Linear_Models_for_Regression.ipynb |
| ch4. Linear Models for Classification(线性分类模型) | ch04_Linear_Models_for_Classfication.ipynb |
| ch5. Neural Networks(神经网络) | ch05_Neural_Networks.ipynb |
| ch6. Kernel Methods(核方法) | ch06_Kernel_Methods.ipynb |
| ch7. Sparse Kernel Machines(稀疏核机) | ch07_Sparse_Kernel_Machines.ipynb |
| ch8. Graphical Models(图模型) | ch08_Graphical_Models.ipynb |
| ch9. Mixture Models and EM(混合模型与 EM) | ch09_Mixture_Models_and_EM.ipynb |
| ch10. Approximate Inference(近似推断) | ch10_Approximate_Inference.ipynb |
| ch11. Sampling Methods(采样方法) | ch11_Sampling_Methods.ipynb |
| ch12. Continuous Latent Variables(连续潜变量) | ch12_Continuous_Latent_Variables.ipynb |
| ch13. Sequential Data(序列数据) | ch13_Sequential_Data.ipynb |
这套 Notebook 与prml/源码包形成"章节 → 模块"的映射关系:例如 ch03 对应prml.linear、ch05 对应prml.nn、ch09 对应prml.rv中的混合模型与prml.clustering、ch11 对应prml.sampling、ch13 对应prml.markov。
5. 源码模块地图:9 大子包逐层拆解
5.1prml.linear:线性模型全家桶
该模块由 prml/linear/init.py 统一导出 12 个模型,覆盖回归与分类两大方向:
- 回归:
LinearRegression、RidgeRegression、BayesianRegression、EmpiricalBayesRegression、VariationalLinearRegression; - 分类:
LogisticRegression、BayesianLogisticRegression、VariationalLogisticRegression、SoftmaxRegression、LeastSquaresClassifier、FishersLinearDiscriminant、Perceptron。
以 LinearRegression 为例,其fit直接用伪逆求解最小二乘:self.w = np.linalg.pinv(x_train) @ y_train,并记录残差方差self.var;predict支持return_std=True返回预测标准差。而 BayesianRegression 则实现了贝叶斯线性回归:构造器接收精度参数alpha(先验精度)与beta(似然精度),fit中按w_precision = precision_prev + beta * x_train.T @ x_train做高斯共轭更新,predict还能通过sample_size从预测分布中直接采样权重,返回参数后验的样本。
5.2prml.rv:概率分布库
prml/rv/init.py 导出一系列概率分布类,全部继承自RandomVariable基类,统一提供pdf、draw、fit等接口。主要包括:
- 基础分布:
Bernoulli、Beta、Categorical、Dirichlet、Gamma、Gaussian、Uniform、StudentsT; - 多元分布:
MultivariateGaussian、MultivariateGaussianMixture、BernoulliMixture; - 变分推断:
VariationalGaussianMixture。
以 Gaussian 为例,其mu既可以是数值,也可以是另一个Gaussian(此时fit执行贝叶斯更新_bayes_mu);tau既可以是精度数组,也可以是Gamma分布对象(此时执行_bayes_tau)。也就是说,同一个类同时支持极大似然估计(_ml)、MAP 估计(_map)与贝叶斯共轭更新三种拟合方式,由传入参数的类型自动分派,这与教材 ch02 的内容严格对应。
5.3prml.clustering:K-Means 聚类
prml/clustering/k_means.py 实现了标准 K-Means:fit从样本中随机选取n_clusters个点作为初始中心,迭代上限iter_max默认 100;每轮用scipy.spatial.distance.cdist计算样本到中心的距离矩阵,按最近中心划分簇并重算中心,当新旧中心np.allclose时提前收敛;predict返回每个样本所属簇的索引。该实现还被MultivariateGaussianMixture的_fit用作 EM 算法的高斯分量初始化。
5.4prml.kernel:核方法、高斯过程与稀疏核机
prml/kernel/init.py 导出 7 个类,覆盖核方法三大流派:
- 核函数:
PolynomialKernel(多项式核)、RBF(径向基核),二者均实现derivatives(对超参数求导)与update_parameters,供高斯过程学习超参数; - 高斯过程:
GaussianProcessRegressor、GaussianProcessClassifier; - 稀疏核机:
SupportVectorClassifier(SVM 分类)、RelevanceVectorRegressor、RelevanceVectorClassifier(相关向量机)。
以 GaussianProcessRegressor 为例:构造器接收核函数对象与观测噪声精度beta(默认 1.0);fit先计算 Gram 矩阵并求逆得到精度矩阵,随后按边际似然对核超参数做梯度上升(iter_max与learning_rate控制迭代);predict支持with_error=True返回预测均值与标准差。而 RBF 的参数向量params长度为ndim + 1,首项为幅值系数c0,其余为各维度的长度尺度系数,核形式为k(x,y) = c0 * exp(-0.5 * sum(c_i * (x_i - y_i)^2))。
5.5prml.markov:序列模型三件套
prml/markov/init.py 导出GaussianHMM、CategoricalHMM、Kalman、kalman_filter、kalman_smoother与Particle。
- 隐马尔可夫模型:基类 HiddenMarkovModel 在构造时接收初始概率
initial_proba与转移矩阵transition_proba,提供fit(EM 算法,iter_max默认 100)、expect/maximize(E/M 步)、forward_backward(前后向算法求后验)、filtering(贝叶斯滤波)与viterbi(最大和算法求最可能隐状态序列)。GaussianHMM 以高斯分布作为发射模型,还额外提供draw(n)直接按参数生成随机观测序列,方便验证。 - Kalman 滤波:Kalman 类完整实现线性高斯状态空间模型的
predict(预测)、filter(更新)、filtering(整段滤波)、smooth/smoothing(平滑)以及基于 EM 的参数学习fit(max_iter默认 10);模块级函数kalman_filter与kalman_smoother提供无状态调用方式。
5.6prml.dimreduction:PCA 家族与自编码器
prml/dimreduction/init.py 导出PCA、BayesianPCA、Autoencoder。
- PCA 构造器指定
n_components,fit支持method="eigen"(特征分解)与method="em"(EM 迭代,默认 100 轮)两种参数估计方式;当样本数小于特征数时,eigen分支会自动切换到小样本技巧(用x.T @ vectors重构特征向量)。fit_transform可一步完成拟合与投影,proba给出边际分布的密度值。 - BayesianPCA 继承
PCA,用经验贝叶斯 EM 学习各维度的自动相关性决定系数alpha,初始方式可选"random"或"eigen"。 - Autoencoder 基于
prml.nn构建多层编码器/解码器,fit中使用 Adam 优化器最大化高斯对数似然。
5.7prml.sampling:蒙特卡洛采样四法
prml/sampling/init.py 导出rejection_sampling、metropolis、metropolis_hastings、sir四种采样方法,对应教材 ch11:
- rejection_sampling:拒绝采样,需要提议分布
rv与常数k,使得k * p(x)完全包住目标分布,循环采样直至凑满n个样本; - metropolis_hastings:Metropolis-Hastings 算法,用提议分布
rv生成候选,按接受概率func(x_new) * rv.pdf(x - x_new) / (func(x) * rv.pdf(x_new - x))决定是否接受,downsample参数控制降采样倍数; - sir:采样-重要性-重采样(SIR),先抽
n*10个候选,按重要性权重重采样出n个样本。
5.8prml.nn:自研自动微分神经网络框架
这是项目中最有特色的模块之一。prml/nn/init.py 从config、network、array到optimizer、loss、nonlinear、math、image、normalization、random、distribution等子模块组成一个迷你深度学习框架:
- Array 是张量核心,封装
value与grad,backward通过全局反传队列 queue.py 按拓扑深度逐层传播梯度,支持cleargrad清零梯度; - Function 是所有算子(如
matmul、sigmoid、relu、softmax、exp、log)的基类,定义forward/backward契约并支持自动广播; - Network 提供参数容器语义,
set_parameter()上下文管理器会自动把Array类型属性注册为可学习参数; - optimizer 提供
Optimizer基类及Adam、Gradient、Momentum、AdaGrad、AdaDelta、RMSProp等实现,Adam 的默认超参为learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-8; - config 提供全局配置,默认
dtype=np.float32(支持 float16/32/64),并可开关enable_backprop; - loss 提供
sigmoid_cross_entropy、softmax_cross_entropy与kl散度。
5.9prml.bayesnet:图模型与信念传播
prml/bayesnet/discrete.py 实现了离散图模型上的精确推断:DiscreteVariable表示随机变量节点,DiscreteProbability(可通过便捷函数discrete创建)表示概率表(CPT);节点间通过receive_message/send_message交换消息,observe(data, proprange)支持设定观测值并以信念传播算法向邻域传播影响(proprange=-1表示无限范围传播)。对应测试位于 test/test_bayesnet/test_discrete.py。
5.10prml.preprocess:数据预处理
prml/preprocess/polynomial.py 提供PolynomialFeature,将输入张成多项式特征(如degree=2时把[a, b]变换为[1, a, b, a^2, ab, b^2]);同目录下还有gaussian、sigmoidal、label_transformer等预处理工具。
6. 算法实现与测试验证:从公式到可运行代码
6.1 可验证的测试基准
仓库的test/目录为关键算法提供了数值基准,这是理解算法正确性的最佳入口。例如:
- test/test_linear/test_bayesian_regression.py:构造三点数据
x=[-1,0,1]、y=[-2,0,2],断言BayesianRegression(alpha=1., beta=1.)拟合后w_mean == 4/3,预测x=3时均值为 4、标准差为 2; - test/test_linear/test_logistic_regression.py:验证
LogisticRegression在 6 个一维样本上收敛到w=[0.73248753],并对新样本给出正确的classify与proba; - test/test_nn/test_backward.py:在异或(XOR)数据集上手工搭建两层网络,将框架自动反向传播得到的每个中间张量的梯度与手推解析梯度逐一
np.allclose比对,直接验证自动微分正确性。
运行全部测试可直接使用 setup.py 中配置的测试套件:
python -m unittest discover -s test6.2 一个端到端示例:线性回归
参照 test/test_linear/test_linear_regression.py 的用法,prml.linear的 API 风格统一为fit(x_train, y_train)+predict(x):
import numpy as np from prml.linear import LinearRegression, BayesianRegression x_train = np.array([-1, 0, 1]).reshape(-1, 1) y_train = np.array([-2, 0, 2]) # 最小二乘线性回归 model = LinearRegression() model.fit(x_train, y_train) print(model.predict(np.array([[3]]))) # 输出预测均值 # 贝叶斯线性回归:返回预测均值与标准差 bayes = BayesianRegression(alpha=1., beta=1.) bayes.fit(x_train, y_train) mean, std = bayes.predict(np.array([[3]]), return_std=True) print(mean, std)6.3 一个端到端示例:K-Means 与混合高斯
MultivariateGaussianMixture 的fit先用 K-Means 确定高斯分量初值,再用 EM 迭代估计均值、协方差与混合系数,最后可通过classify输出每个样本的簇归属;单组件聚类则可直接使用KMeans(n_clusters=k).fit(x)。
7. 总结
PRML 项目把 Bishop 教材中的算法落地为一套结构清晰、风格统一的 Python 库:prml/九个模块覆盖从概率分布、线性模型、核方法到神经网络、图模型、采样与序列模型的完整知识体系;notebooks/中 13 个章节 Notebook 提供循序渐进的演示入口;test/中的数值基准保证了核心实现的可复现性。对学习者而言,最有效的使用路径是:按 README.md 的安装命令建好环境 → 打开对应章节 Notebook 理解算法效果 → 再到 prml/ 源码中阅读具体实现,形成"公式 → 代码 → 结果"的完整闭环。
- 机器学习
- 深度学习
【免费下载链接】PRML
PRML algorithms implemented in Python
相关推荐
PRML项目深度解析:Bishop经典算法的Python实现
PRML项目深度解析:Bishop经典算法的Python实现 PRML项目是一个基于Python的开源机器学习库,专门实现了Christopher Bishop
机器学习深度学习nopecha-extension核心算法解析:图像识别与机器学习模型应用
nopecha extension核心算法解析:图像识别与机器学习模型应用 你是否还在为网站上频繁出现的验证码(CAPTCHA)而烦恼?无论是登录账号、提交表单
micro-sam微调模型选择清单:LM、EM、组化病理、医学影像4大领域怎么选最优模型?
micro sam微调模型选择清单:LM、EM、组化病理、医学影像4大领域怎么选最优模型? micro sam(Segment Anything for Mic
人工智能计算机视觉图像处理科研
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考