《机器学习数学基础》补充资料:仿射变换
本文是对《机器学习数学基础》 第 2 章 2.2.4 节齐次坐标系的内容拓展。
1. 名称的来源
仿射,是英文单词 affine 的中文翻译。
单词 affine,读音:[ə’faɪn]。来自于英语 affinity。英语词根 fin 来自于拉丁语 finis,表示“边界,末端”,例如finish、final 等单词。词头 ad 表示“去,往”,拼出名词 affinity,本意为“接壤,结合”,用来指“姻亲,由于婚姻而产生的亲戚关系”,引申为“亲密关系,相似性”等 [ 1 ] ^{[1]} [1]。
中文名称“仿射”,有一种观点是音译,来自“affine geometry”中的“fine”和“geo”两部分,于是“仿射几何”就翻译出来了 [ 2 ] ^{[2]} [2]。
2. 变换
对于几何图形,经常会有一些平移、旋转、缩放等形式的变换,如下图所示 [ 3 ] ^{[3]} [3] :

- 平移,translation
- 旋转,rotation
平移和旋转,图形的形状(面积或体积)不变,也称为刚体变换(rigid transformation)或欧几里得变换(Euclidean transformation)。
- 缩放,scaling。如果每个坐标方向的缩放系数相同(即各向同性,isotropic),则为 uniform scaling
- 反射,reflection,关于某坐标轴对称。反射也可以看成是缩放的一个特例。
平移、旋转和各向同性的缩放,统称为相似变换(similarity transformation)。
- 剪切变换,shear mapping
下图显示了相似变换、线性变换的概念所涵盖的变换方式 [ 4 ] ^{[4]} [4] 。

在线性代数中所研究的线性变换(参阅《机器学习数学基础》第2章2.2节),包括:
- 旋转
- 反射
- 剪切
- 各向同性或者不同性的缩放
以上变换的组合,也是线性变换。线性变换遵循着加法和乘法封闭原则,即:
L ( p + q ) = L ( p ) + L ( q ) L ( α p ) = α L ( p ) \begin{split}&L(p+q)=L(p)+L(q)\\&L(\alpha p)=\alpha L(p)\end{split} L(p+q)=L(p)+L(q)L(αp)=αL(p)
但是,平移不是线性变换(《机器学习数学基础》第 2 章 2.2.1 节)。如果将上述的线性变换与平移合并起来,则称为 affine transformation,翻译为仿射变换 [ 4 ] ^{[4]} [4]。

变换的范围还可继续扩大,那就是射影变换(projective transformation) [ 4 ] ^{[4]} [4]。

本文重点探讨仿射变换。
3. 仿射空间
仿射空间(affine space),又称线性流形,是数学中的几何结构,这种结构是欧式空间的仿射特性的推广 [ 5 ] ^{[5]} [5]。
在仿射空间中,点与点之间的差即为向量,点与向量的加法可以得到另一个点,但是点与点之间不可以相加。
仿射空间中没有特定的原点,因此不能将空间中的每一点和特定的向量对应起来。仿射空间中只有从一个点到另一个点的位移向量,或称平移向量。
如果 X \mathbb X X 是仿射空间, a , b ∈ X \pmb{a},\pmb{b}\in\mathbb{X} a,b∈X ,那么从 a \pmb{a} a 到 b \pmb{b} b 的位移向量为 b − a \pmb{b} − \pmb{a} b−a 。
所有向量空间都可看作仿射空间。
若 X \mathbb{X} X 是向量空间, L ∈ X \pmb{L}\in\mathbb{X} L∈X 是向量子空间, a ∈ X \pmb{a}\in\mathbb{X} a∈X ,则 a + L = { a + l : l ∈ L } \pmb{a}+\pmb{L}=\{a+l:l\in\pmb{L}\} a+L={a+l:l∈L} 是仿射空间。这里的 a \pmb{a} a 也称为平移向量。
若向量空间 X \mathbb{X} X 的维度是 n < ∞ n\lt\infty n<∞ ,那么 X \mathbb{X} X 的仿射子空间也可看作一组非齐次线性方程的解;而齐次方程的解永远是线性子空间,也就是说齐次方程的解永远包含零解。维度为 n − 1 n − 1 n−1 的仿射空间也叫做仿射超平面。
4. 仿射变换
仿射变换(affine transformation),又称仿射映射,是对一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。即:
y = A x + b \pmb{y}=\pmb{Ax}+\pmb{b} y=Ax+b
平移变换不能用矩阵表示,为此使用齐次坐标系(《机器学习数学基础》第2章2.2.4节)。
4.1 仿射变换的性质
设 f ( x ) = A x + b f(\pmb{x})=\pmb{Ax}+\pmb{b} f(x)=Ax+b 是一个仿射变换,则 f f f 具有:
- 直线到直线的映射
- 原来平行的直线变换之后仍然平行
证明
-
设直线 l : p + t u , t ∈ R l:\pmb{p}+t\pmb{u},t\in\mathbb{R} l:p+tu,t∈R ,则:
f ( p + t u ) = A ( p + t u ) + b = ( A p + b ) + t ( A u ) = p 1 + t u 1 f(\pmb{p}+t\pmb{u})=\pmb{A}(\pmb{p}+t\pmb{u})+\pmb{b}=(\pmb{Ap}+\pmb{b})+t(\pmb{Au})=\pmb{p}_1+t\pmb{u}_1 f(p+tu)=A(p+tu)+b=(Ap+b)+t(Au)=p1+tu1
其中 p 1 = A p + b \pmb{p}_1=\pmb{Ap}+\pmb{b} p1=Ap+b , u 1 = A u \pmb{u_1}=\pmb{Au} u1=Au ,则 f ( l ) = l 1 , l 1 : p 1 + t u 1 , t ∈ R f(l)=l_1, l_1:\pmb{p}_1+t\pmb{u}_1,t\in\mathbb{R} f(l)=l1,l1:p1+tu1,t∈R 仍然是直线。 -
设 l : p + t u l:\pmb{p}+t\pmb{u} l:p+tu 和 m : q + t v m:\pmb{q}+t\pmb{v} m:q+tv 是平行线,则 v = k u , k ∈ R \pmb{v}=k\pmb{u},k\in\mathbb{R} v=ku,k∈R ,所以:
f ( p + t u ) = A ( p + t u ) + b = ( A p + b ) + t ( A u ) = p 1 + t u 1 f ( q + t v ) = f ( q + t ( k u ) ) = A ( q + t ( k u ) ) + b = ( A q + b ) + t ( A k u ) = q 1 + t ( k u 1 ) \begin{split} f(\pmb{p}+t\pmb{u})&=\pmb{A}(\pmb{p}+t\pmb{u})+\pmb{b}=(\pmb{Ap}+\pmb{b})+t(\pmb{Au})=\pmb{p}_1+t\pmb{u}_1 \\ f(\pmb{q}+t\pmb{v})&=f(\pmb{q}+t(k\pmb{u}))\\&=\pmb{A}(\pmb{q}+t(k\pmb{u}))+\pmb{b}\\&=(\pmb{Aq}+\pmb{b})+t(\pmb{A}k\pmb{u)}\\&=\pmb{q}_1+t(k\pmb{u}_1) \end{split} f(p+tu)f(q+tv)=A(p+tu)+b=(Ap+b)+t(Au)=p1+tu1=f(q+t(ku))=A(q+t(ku))+b=(Aq+b)+t(Aku)=q1+t(ku1)
故,变换之后所得 l 1 : p 1 + t u 1 l_1:\pmb{p}_1+t\pmb{u}_1 l1:p1+tu1 与 m 1 : q 1 + t ( k u 1 ) m_1:\pmb{q}_1+t(k\pmb{u}_1) m1:q1+t(ku1) 仍然平行。
4.2 计算工具
如果对图形进行仿射变换,以下列举两个示例。
1. OpenCV
import cv2
import numpy as np
from matplotlib import pyplot as plt img = cv2.imread('headpic.png')
rows, cols, ch = img.shape pts1 = np.float32([[50, 50], [200, 50], [50, 200]]) pts2 = np.float32([[10, 100], [200, 50], [100, 250]]) # 构造对应点变换矩阵
M = cv2.getAffineTransform(pts1, pts2)
dst = cv2.warpAffine(img, M, (cols, rows)) plt.subplot(121)
plt.imshow(img)
plt.title('Input') plt.subplot(122)
plt.imshow(dst)
plt.title('Output') plt.show()
输出图像

2. 仿射变换模块
- Affine_transform:
pip install affine-transform - Affine:
pip install affine,github仓库地址:https://github.com/sgillies/affine
参考文献
[1]. tetradecane. https://www.zhihu.com/question/345279684/answer/819134982
[2]. 关于仿射这个词有什么通俗易懂的解释吗?. https://www.zhihu.com/question/368556037/answer/990194830
[3]. https://www.cnblogs.com/shine-lee/p/10950963.html
[4]. http://www.cs.tau.ac.il/~dcor/Graphics/cg-slides/trans3d.pdf
[5]. https://zh.wikipedia.org/wiki/仿射空间
相关文章:
《机器学习数学基础》补充资料:仿射变换
本文是对《机器学习数学基础》 第 2 章 2.2.4 节齐次坐标系的内容拓展。 1. 名称的来源 仿射,是英文单词 affine 的中文翻译。 单词 affine,读音:[ə’faɪn]。来自于英语 affinity。英语词根 fin 来自于拉丁语 finis,表示“边…...
冲刺一区!挑战7天完成一篇趋势性分析GBD DAY1-7
Day1. 公开数据库的挖掘太火热了,其中GBD数据库的挖掘又十分的火爆.那我就来挑战一篇GBD、一篇关于趋势性分析的GBD! GBD数据库挖掘是目前的四大刊常客,经常出现在顶级期刊上面。这个数据库亮点就是:可视化,统计学简单、而数据可…...
ZK-ALU-在有限域上实现左移
先看在实数域上实现左移, 再看在有限域上的实现 左移-整数 计算机中的左移计算(<< 操作)通常由处理器的硬件电路直接支持,因此效率非常高。在编程语言中,左移操作可以通过位移运算符(例如 C/C 中的 <<&a…...
掌握API和控制点(从Java到JNI接口)_36 JNI开发与NDK 04
4、 *.so的入口函数:JNI_OnLoad() VM (virtual machine)的角色 Java代码在VM上执行。在执行Java代码的过程中,如果Java需要与本地代码(*.so)沟通时, VM就会把*.so視为插件<Tn>而加载到VM里。然后让Java函数呼叫到这插件<Tn>里的…...
Spring Bean 容器
技术成长,是对场景设计细节不断的雕刻! 你觉得自己的技术什么时候得到了快速的提高,是CRUD写的多了以后吗?想都不要想,绝对不可能!CRUD写的再多也只是能满足你作为一个搬砖工具人,敲击少逻辑流…...
Maven全解析:从基础到精通的实战指南
概念: Maven 是跨平台的项目管理工具。主要服务基于 Java 平台的构建,依赖管理和项目信息管理项目构建:高度自动化,跨平台,可重用的组件,标准化的流程 依赖管理: 对第三方依赖包的管理…...
【开源免费】基于SpringBoot+Vue.JS贸易行业crm系统(JAVA毕业设计)
本文项目编号 T 153 ,文末自助获取源码 \color{red}{T153,文末自助获取源码} T153,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
高效接口限流:基于自定义注解与RateLimiter的实践
在高并发场景下,接口的流量控制是保证系统稳定性和提升性能的关键之一。通过实现接口限流,我们可以有效避免系统在访问高峰时发生崩溃。本文将详细介绍如何通过自定义注解和切面编程结合RateLimiter来实现接口的限流功能,以应对高并发请求。 …...
nodejs:express + js-mdict 网页查询英汉词典,能播放声音
向 DeepSeek R1 提问: 我想写一个Web 前端网页,后台用 nodejs js-mdict, 实现在线查询英语单词 1. 项目结构 首先,创建一个项目目录,结构如下: mydict-app/ ├── public/ │ ├── index.html │ ├── st…...
无人机PX4飞控 | PX4源码添加自定义uORB消息并保存到日志
PX4源码添加自定义uORB消息并保存到日志 0 前言 PX4的内部通信机制主要依赖于uORB(Micro Object Request Broker),这是一种跨进程的通信机制,一种轻量级的中间件,用于在PX4飞控系统的各个模块之间进行高效的数据交换…...
【IocDI】_存储Bean的五大类注解及getBean的使用
目录 1. Bean的存储 1.1 类注解 1.1.1 Controller:控制器存储 1.1.2 Service:服务存储 1.1.3 Repository:仓库存储 1.1.4 Component:组件存储 1.1.5 Configuration:配置存储 1.2 五大类注解之间的关系 2. get…...
VLAN 基础 | 不同 VLAN 间通信实验
注:本文为 “ Vlan 间通信” 相关文章合辑。 英文引文,机翻未校。 图片清晰度限于原文图源状态。 未整理去重。 How to Establish Communications between VLANs? 如何在 VLAN 之间建立通信? Posted on November 20, 2015 by RouterSwi…...
GRE阅读双线阅读 --青山学堂GRE全程班 包括 阅读、数学、写作、填空、背单词
新版GRE考试整体结构 section题量时间写作1篇issue30min语文S112道题(7道填空5道阅读)18min数学S112道题21min语文S215道题(7道填空8道阅读)23min数学S215道题26min Tips: 写作结束后,语文和数学的顺序不固定,2中可能: issue -> V ->…...
算法总结-二分查找
文章目录 1.搜索插入位置1.答案2.思路 2.搜索二维矩阵1.答案2.思路 3.寻找峰值1.答案2.思路 4.搜索旋转排序数组1.答案2.思路 5.在排序数组中查找元素的第一个和最后一个位置1.答案2.思路 6.寻找旋转排序数组中的最小值1.答案2.思路 1.搜索插入位置 1.答案 package com.sunxi…...
litemall,又一个小商场系统
litemall Spring Boot后端 Vue管理员前端 微信小程序用户前端 Vue用户移动端 代码地址:litemall: 又一个小商城。 litemall Spring Boot后端 Vue管理员前端 微信小程序用户前端 Vue用户移动端...
5.5.1 面向对象的基本概念
文章目录 基本概念面向对象的5个原则 基本概念 面向对象的方法,特点时其分析与设计无明显界限。虽然在软件开发过程中,用户的需求会经常变化,但客观世界对象间的关系是相对稳定的。对象是基本的运行实体,由数据、操作、对象名组成…...
Java_类加载器
小程一言类加载器的基础双亲委派模型核心思想优势 各类加载器的职责 类加载器的工作流程举例:如何在Java中使用类加载器启动类加载器、扩展类加载器与系统类加载器输出解释自定义类加载器 类加载器与类冲突总结 小程一言 本专栏是对Java知识点的总结。在学习Java的过…...
开源音乐管理软件Melody
本文软件由网友 heqiusheng 推荐。不过好像已经是一年前了 😂 简介 什么是 Melody ? Melody 是你的音乐精灵,旨在帮助你更好地管理音乐。目前的主要能力是帮助你将喜欢的歌曲或者音频上传到音乐平台的云盘。 主要功能包括: 歌曲…...
一、TensorFlow的建模流程
1. 数据准备与预处理: 加载数据:使用内置数据集或自定义数据。 预处理:归一化、调整维度、数据增强。 划分数据集:训练集、验证集、测试集。 转换为Dataset对象:利用tf.data优化数据流水线。 import tensorflow a…...
Vue.js组件开发-实现左侧浮动菜单跟随页面滚动
使用 Vue 实现左侧浮动菜单跟随页面滚动 实现步骤 创建 Vue 项目:使用 Vue CLI 创建一个新的 Vue 项目。设计 HTML 结构:包含一个左侧浮动菜单和一个主要内容区域。编写 CSS 样式:设置菜单的初始样式和滚动时的样式。使用 Vue 的生命周期钩…...
分析哲学:从 语言解剖到 思想澄清的哲学探险
分析哲学:从 语言解剖 到 思想澄清 的哲学探险 第一节:分析哲学的基本概念与公式解释 【通俗讲解,打比方来讲解!】 分析哲学,就像一位 “语言侦探”,专注于 “解剖语言”,揭示我们日常使用的语…...
MySQL 插入数据指南
MySQL 插入数据指南 引言 MySQL 是一款广泛使用的开源关系数据库管理系统,被广泛应用于各种规模的组织中。在数据库管理中,数据的插入是基础操作之一。本文将详细介绍如何在 MySQL 中插入数据,包括插入单条记录和多条记录,以及一…...
寒假刷题Day20
一、80. 删除有序数组中的重复项 II class Solution { public:int removeDuplicates(vector<int>& nums) {int n nums.size();int stackSize 2;for(int i 2; i < n; i){if(nums[i] ! nums[stackSize - 2]){nums[stackSize] nums[i];}}return min(stackSize, …...
鸿蒙物流项目之基础结构
目录: 1、项目结构2、三种包的区别和使用场景3、静态资源的导入4、颜色样式设置5、修改项目名称和图标6、静态包基础目录7、组件的抽离8、在功能模块包里面引用静态资源包的组件 1、项目结构 2、三种包的区别和使用场景 3、静态资源的导入 放在har包中,那…...
[漏洞篇]SQL注入漏洞详解
[漏洞篇]SQL注入漏洞详解 介绍 把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以达到攻击的目的。…...
【最后203篇系列】006 -使用ollama运行deepseek-r1前后端搭建
说明 这块已经不算新内容了,年前搭完了后端(ollama),本来想早点分享的,但是当时的openwebui有点不给力,有些地方不适配,然后配置项找不到。所以前端没搭好,也就不完整:只能通过命令…...
CSS Module 常用笔记
Date: January 30, 2025 CSS 先介绍下普通 CSS,再简明介绍下 css module 的使用 普通 CSS 内联 style 定义: 内联 style 是通过在元素的 style 属性中直接设置 CSS 样式。这种方式允许我们直接在 JSX 中为组件或元素添加样式。 写法: &…...
JDK-1.8.0_432安装(CentOS7)
目录 1、卸载系统自带JDK 2、下载安装包并解压 3、赋予可执行权限 4、设置环境变量 5、刷新环境变量 6、查看JDK版本 1、卸载系统自带JDK # 查询出自带的jdk rpm -qa | grep jdk rpm -qa | grep java # 将上述命令列出的包依次删除 rpm -e --nodeps xxxxxxx 2、下载…...
【Linux】24.进程信号(1)
文章目录 1. 信号入门1.1 进程与信号的相关知识1.2 技术应用角度的信号1.3 注意1.4 信号概念1.5 信号处理常见方式概览 2. 产生信号2.1 通过终端按键产生信号2.2 调用系统函数向进程发信号2.3 由软件条件产生信号2.4 硬件异常产生信号2.5 信号保存 3. 阻塞信号3.1 信号其他相关…...
C++ 字面量深度解析:从基础到实战进阶
在 C 开发中,字面量(Literal)不仅是基础语法的一部分,更是提升代码可读性、安全性和性能的关键工具。本文将深入探讨 C 字面量的高级特性、最新标准支持(C11/14/17/20)以及实际开发中的应用技巧,…...
