向量与空间
第 0 章 动机
- 我们生活在 3 维空间中,为了处理现实世界的问题,需要一种合适的方式描述「空间」
- 作线性代数施展作用的舞台,向量空间是对现实空间进行一定程度抽象化后得到的东西
- 打个比方:把 3 维空间中的物体在 2 维的显示屏上展示出来的时候,我们需要面对很多问题
- 当我们的目光跟随物体的变换而移动、旋转时,映入眼帘的 2 维画面是怎么变化的?
- 要解决这类问题,线性代数发挥了基础性的作用
- 学习线性代数可不只是为了了解现实空间的问题
- 几乎处处都会遇到由多个数值组成的一组数据,即使与「空间」看似没什么直接关系,也能进行推理
- 只要将数据诠释为高维空间中的点,就可以利用自己的直观感受,通过「空间」来理解数据的行为
- 直观认知仅限于 3 维以下的空间,但只要稍加推广,对于一般的 维空间中的现象,同样可以从直观上理解
- 这已经是数据分析中强有力的工具了
有效利用线性近似的手段
- 线性代数在「空间」中大显身手的地方:主成分分析、最小二乘法
- 本书作为「基础篇」,原则上不考虑带度量的问题,以无量度的问题为中心
最直接的定义:把数值罗列起来就是向量
把数排成一列就是向量
比如
需要强调分量个数时,分别称为 2 维向量、3 维向量和 5 维向量
提到向量,不特别说明就指上面这样的竖排的「列向量」
也存在像 这样的横排的「行向量」,但本书中不加说明时默认为列向量
列向量书写起来比较占空间,所以使用以下写法
其中 是 Transpose(转置)的首字母
为什么偏爱列向量
- 对于「将映射 作用于 」的操作,一般人会写成
- 对于「将矩阵 (所表示的线性映射)作用于向量 」的操作,用 表示
- 如果这里的 是行向量,结果就变成了 —— 先对象后操作的写法,不太符合一般人的思维
- 面向对象程序设计的读者,相比
f(x)来说,说不准会觉得x.f的写法更加自然
一个应用场景
- 一个搭载了 10 个传感器的机器人观测到了 10 组数据,当想要把它们作为一个整体来处理时,向量就派上用场了
「空间」的形象
什么是空间
- 直觉上,空间是「能容纳物体的容器」
- 1 维的空间是一条线,2 维是平面,3 维是立体
- 更高维的空间无法直接想象,但有办法构造出来
构造 维空间
- 用 个数来指定一个点的位置,这 个数就是坐标
- 关键在于「坐标」这个概念:坐标一旦给定,点就唯一确定了
- 在 2 维平面上,每个点由 2 个数指定;在 3 维空间中,每个点由 3 个数指定
基底
为什么要基底
- 有了坐标就能描述点的位置,但「坐标本身」依赖于用什么来度量
- 同一个物理位置,在不同的坐标下是不同的数值
- 基底就是一组「用来造坐标的基准」
基底的定义
- 一组向量,如果它们能「撑起」整个空间,就称为这组向量构成该空间的一个基底
- 构成基底的条件(1.1.4):
- 线性无关 —— 不能由其他向量线性组合得到
- 张成整个空间 —— 空间里的任何向量都能由它们线性组合得到
- 基底不唯一,但只要选定一个,空间里的每个向量就有唯一的表示
维数
- 基底里向量的个数,称为这个空间的维数
- 2 维空间维数为 2,3 维空间维数为 3
- 维空间的基底含 个向量
坐标
有了基底,向量就能唯一分解成基底的线性组合
各个系数就是这个向量在这组基底下的坐标
用 Ruby 验证:向量在标准基底和另一组基底下的坐标
#ruby
# 向量 v = (2, 5),在标准基底下的坐标就是它自己
v = [2.0, 5.0]
# 换一组基底:b1 = (1, 0), b2 = (1, 1)
# 解 c1*b1 + c2*b2 = v,即 c1 + c2 = 2, c2 = 5
b1 = [1.0, 0.0]
b2 = [1.0, 1.0]
# 由 c2 = v[1],c1 = v[0] - c2
c2 = v[1]
c1 = v[0] - c2
coords = [c1, c2]
puts "坐标: #{coords}" # 坐标: [-3.0, 5.0]
# 还原:c1*b1 + c2*b2 应该等于 v
restored = 2.times.map { |j| coords[0] * b1[j] + coords[1] * b2[j] }
puts "还原: #{restored}" # 还原: [2.0, 5.0]
puts "与原向量相等? #{restored == v}" # 与原向量相等? true
# 标准基底下的坐标
puts "标准基底坐标: #{v}" # 标准基底坐标: [2.0, 5.0]