《机器学习数学基础》补充资料:仿射变换

news/2025/2/4 20:43:29/

本文是对《机器学习数学基础》 第 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,bX ,那么从 a \pmb{a} a b \pmb{b} b 的位移向量为 b − a \pmb{b} − \pmb{a} ba

所有向量空间都可看作仿射空间。

X \mathbb{X} X 是向量空间, L ∈ X \pmb{L}\in\mathbb{X} LX 是向量子空间, a ∈ X \pmb{a}\in\mathbb{X} aX ,则 a + L = { a + l : l ∈ L } \pmb{a}+\pmb{L}=\{a+l:l\in\pmb{L}\} a+L={a+l:lL} 是仿射空间。这里的 a \pmb{a} a 也称为平移向量。

若向量空间 X \mathbb{X} X 的维度是 n < ∞ n\lt\infty n< ,那么 X \mathbb{X} X 的仿射子空间也可看作一组非齐次线性方程的解;而齐次方程的解永远是线性子空间,也就是说齐次方程的解永远包含零解。维度为 n − 1 n − 1 n1 的仿射空间也叫做仿射超平面。

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 具有:

  1. 直线到直线的映射
  2. 原来平行的直线变换之后仍然平行

证明

  1. 设直线 l : p + t u , t ∈ R l:\pmb{p}+t\pmb{u},t\in\mathbb{R} l:p+tu,tR ,则:

    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,tR 仍然是直线。

  2. 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,kR ,所以:

    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/仿射空间


http://www.ppmy.cn/news/1569323.html

相关文章

【C++动态规划】1473. 粉刷房子 III|2056

本文涉及知识点 C动态规划 LeetCode1473. 粉刷房子 III 在一个小城市里&#xff0c;有 m 个房子排成一排&#xff0c;你需要给每个房子涂上 n 种颜色之一&#xff08;颜色编号为 1 到 n &#xff09;。有的房子去年夏天已经涂过颜色了&#xff0c;所以这些房子不可以被重新涂…

[EAI-028] Diffusion-VLA,能够进行多模态推理和机器人动作预测的VLA模型

Paper Card 论文标题&#xff1a;Diffusion-VLA: Scaling Robot Foundation Models via Unified Diffusion and Autoregression 论文作者&#xff1a;Junjie Wen, Minjie Zhu, Yichen Zhu, Zhibin Tang, Jinming Li, Zhongyi Zhou, Chengmeng Li, Xiaoyu Liu, Yaxin Peng, Chao…

1. 【.NET Aspire 从入门到实战】--理论入门与环境搭建--引言

在当前软件开发领域&#xff0c;云原生和微服务架构已经成为主流趋势&#xff0c;传统的单体应用正逐步向分布式系统转型。随着业务需求的不断变化与用户规模的迅速扩大&#xff0c;如何在保证高可用、高扩展性的同时&#xff0c;还能提高开发效率与降低维护成本&#xff0c;成…

【C++】线程池实现

目录 一、线程池简介线程池的核心组件实现步骤 二、C11实现线程池源码 三、线程池源码解析1. 成员变量2. 构造函数2.1 线程初始化2.2 工作线程逻辑 3. 任务提交(enqueue方法)3.1 方法签名3.2 任务封装3.3 任务入队 4. 析构函数4.1 停机控制 5. 关键技术点解析5.1 完美转发实现5…

使用MATLAB进行雷达数据采集可视化

本文使用轮趣科技N10雷达&#xff0c;需要源码可在后台私信或者资源自取 1. 项目概述 本项目旨在通过 MATLAB 读取 N10 激光雷达 的数据&#xff0c;并进行 实时 3D 点云可视化。数据通过 串口 传输&#xff0c;并经过解析后转换为 三维坐标点&#xff0c;最终使用 pcplayer 进…

springboot启动配置文件-bootstrap.yml常用基本配置

在Spring Boot应用程序中&#xff0c;bootstrap.yml文件通常用于配置应用程序的启动阶段。在这个文件中&#xff0c;你可以配置一些在应用程序启动之前需要加载的属性&#xff0c;例如外部配置源、加密属性等。以下是一些常用的基本配置项&#xff1a; 1. 外部配置源 1.1 配置…

因果推断与机器学习—因果推断入门(1)

在机器学习被广泛应用于对人类产生巨大影响的场景(如社交网络、电商、搜索引擎等)的今天,因果推断的重要性开始在机器学习社区的论文和演讲中被不断提及。图灵奖得主 Yoshua Bengio 在对系统 2(system 2,这个说法来自心理学家 Daniel Kahneman 的作品,人类大脑由两套系统…

Spring Boot 热部署实现指南

在开发 Spring Bot 项目时&#xff0c;热部署功能能够显著提升开发效率&#xff0c;让开发者无需频繁重启服务器就能看到代码修改后的效果。下面为大家详细介绍一种实现 Spring Boot 热部署的方法&#xff0c;同时也欢迎大家补充其他实现形式。 步骤一、开启 IDEA 自动编译功能…