news 2026/10/14 1:59:52

PRML 项目全解析:用 Python 复现 Bishop《模式识别与机器学习》全部核心算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PRML 项目全解析:用 Python 复现 Bishop《模式识别与机器学习》全部核心算法
  • 机器学习
  • 深度学习

【免费下载链接】PRML

PRML algorithms implemented in Python

项目地址:https://gitcode.com/gh_mirrors/pr/PRML
点击查看免费下载

本指南以仓库根目录的 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.markovHMM、Kalman 滤波与粒子滤波ch13
prml.dimreductionPCA、贝叶斯 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 test

6.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

项目地址:https://gitcode.com/gh_mirrors/pr/PRML
点击查看免费下载

相关推荐

上一篇:33 JavaScript核心概念与React Native移动开发实战指南
下一篇:Suyu安卓版本深度体验:移动端Switch模拟器的完整指南 🎮

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 1:59:42

网络虚拟化原理与实战:Overlay方案、OVS调优与控制器选型

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/14 1:58:17

uni-request 重磅发布:三端统一网络请求新标准

v0.1.0 为首个可用版本:以 uni.request 为唯一底层依赖、不重造网络栈,把 URL 拼接、header 合并、超时取消、错误收敛这些每次都要重写的重复劳动收进一套 axios 心智的 API。Web / 微信小程序 / Android 三端编译验证通过,Web 端 15 项真实…

作者头像 李华
网站建设 2026/10/14 1:58:07

ai写论文哪个软件最好?毕夏AI用“全流程”回答了这个问题

毕夏AI官网:www.bixiaai.com 微信公众号搜一搜:毕夏AI官网 先别急着要答案 每次被问到“ai写论文哪个软件最好”,我都会想起一个场景:答辩现场,评委问学生“你这篇论文最核心的研究问题是什么”,学生翻…

作者头像 李华
网站建设 2026/10/14 1:57:35

02:财务管理

/*** 题目名称&#xff1a;财务管理 <p>* 题目来源&#xff1a;http://noi.openjudge.cn/ch0105/02/ <p>* 程序功能&#xff1a;计算12个月的平均月末结余** author 潘磊&#xff0c;just_panleijust.edu.cn* version 1.0*/import java.util.Scanner;public class …

作者头像 李华
网站建设 2026/10/14 1:56:44

无人机视角船只检测:YOLO11在海上搜救中的实战指南

简介&#xff1a;无人机视角下的船只检测与水上目标识别是海上搜救、港口监控等任务的关键环节。这套基于Ultralytics YOLO11的完整资源包面向目标检测初学者与无人机视觉研究者&#xff0c;内置标注数据集、训练好的模型权重及配套使用教程&#xff0c;可直接用于YOLOv5/v8/v9…

作者头像 李华
网站建设 2026/10/14 1:56:10

自动驾驶决策规划控制全链路解析:从行为决策到运动规划

简介&#xff1a;这是一份《决策规划控制讲义》PDF&#xff0c;源自“忠厚老实的老王”主讲的自动驾驶课程&#xff0c;面向算法工程师、车辆工程学生及对智能驾驶原理感兴趣的学习者&#xff0c;系统梳理了决策规划与控制的核心知识框架。资源为1个PDF文件&#xff0c;大小约6…

作者头像 李华