目录
[TOC]
概述
整体框架
graph TB
1((空间变换))---11(维度)
11-->坐标与变换
11-->空间与映射
11-->近似与拟合
11-->相似与特征
11-->降维与压缩
1---12(数据处理)
12-->用空间表示数据
12-->用空间处理数据
12-->用空间优化数据
要点
从线性代数的几何意义理解重要概念.
Python库:numpy
import numpy as np
坐标与变换: 高楼平地起
描述空间的工具: 向量
graph LR
0{几何空间}
0--坐标点---1
0--有向线段---1
1((向量))
1-->11(类型)
11--纵向排列-->列向量
11--横向排列-->行向量
1-->12(属性)
12--元素平方和的开平方根-->模长
1---13(运算)
13-->加减法
13-->数乘
13-->内积和外积
向量的概念
定义: 把一组数字排列成一行或一列
-
分类:
- 列向量(默认): 纵向排列
- 行向量: 横向排列
-
属性:
-
模长:[图片上传失败...(image-18a456-1635079870526)]
空间向量(x,y,z),其中x,y,z分别是三轴上的坐标,模长是 [3] :
[图片上传失败...(image-f563af-1635079870527)]
平面向量(x,y),模长是:
[图片上传失败...(image-8bb46b-1635079870527)]
对于向量
[图片上传失败...(image-210214-1635079870527)]
属于n维复向量空间
[图片上传失败...(image-a0a886-1635079870527)]
=(x1,x2,…,xn)
[图片上传失败...(image-cc9954-1635079870527)]
的模为
[图片上传失败...(image-db488d-1635079870527)]
=
[图片上传失败...(image-253a6-1635079870527)]
a=np.array((1,2,3,4)) np.sqrt(np.square(a).sum()) #5.477225575051661
-
-
用途:
- 描述几何空间中的坐标点。几何空间维度有向量的成分个数决定.
- 描述几何空间从原点到该向量坐标点的有向线段。
- 值的正负性代表与坐标轴的方向是一致还是相反;
- 向量相加表示多个向量首尾相连,两端的起止点相连的有向线段;
- 向量的数乘表示向量在某方向上进行相应的倍数改变。
- 描述事物的属性和特征, 并对应到高维空间中进行定量表达.
-
python实现:
-
np.array()
+np.newaxis
import numpy as np '''行向量''' a=np.array([1,2,3,4]) print(a) #[1 2 3 4] '''列向量''' A=np.array([1,2,3,4]) A_t=A[:,np.newaxis] print(A_t,'\n',A_t.shape) ''' [[1] [2] [3] [4]] (4, 1) '''
-
-
np.array()
+.T
a=np.array([[1,2,3,4]]) a.shape #(1, 4) a.T ''' array([[1], [2], [3], [4]])''' a.T.shape #(4, 1)
向量的运算
向量的加/减法:+
、-
两个维度相同的向量,将相同位置上的元素相加——》维度不变
A=np.array([1,2,3,4])
A_t=A[:,np.newaxis]
a=np.array([[1,2,3,4]])
print(A_t+a.T)
print(A_t-a.T)
'''
[[2]
[4]
[6]
[8]]'''
'''
[[0]
[0]
[0]
[0]]'''
向量的数量乘积:*
标量同向量的每个元素分别相乘——》维度不变
print(3*a.T)
'''
[[ 3]
[ 6]
[ 9]
[12]]'''
向量间的乘法:内积和外机
内积:np.dot() #传入一维数组(行向量)
同维数向量,将对应位置上的元素相乘,然后合并相加——》标量
内积的另一种表示方式:
向量u在向量v上的投影长度乘向量v的模长
a=b=np.array((1,2,3,4))
a.dot(b)
#30
外积: np.cross()
类似求解矩阵的特征值
另一种表示方式:
在二维平面中,表示两个向量张成的平行四边形的''面积'', 三维中表示两个向量张成的法向量
img
a=np.array((1,2,3))
b=np.array((3,4,5))
np.cross(a,b) #只支持2-3维向量
#array([-2, 4, -2]) 相同向量的外积为0向量
先数乘后叠加: 向量的线性组合
a=np.array((1,2,3))
b=np.array((3,4,5))
c=np.array((2,4,7))
3*a+6*b+2*c
#array([25, 38, 53])
相关概念: 共线, 共面
基底构建一切, 基底决定坐标
graph LR
基向量--成员-->基底
基向量--"系数(投影值)"-->坐标
基向量--正方向且长度为1-->1["ex/ey"]
1--内积-->坐标
基底-->张成空间
向量的坐标
- 描述几何空间中的坐标点。几何空间维度有向量的成分个数决定.
- 描述几何空间从原点到该向量坐标点的有向线段。
- 值的正负性代表与坐标轴的方向是一致还是相反;
- 向量相加表示多个向量首尾相连,两端的起止点相连的有向线段;
- 向量的数乘表示向量在某方向上进行相应的倍数改变。
向量的坐标依赖于选取的基底
基底:被选作向量u基准的一组向量(ex,ey)
-
基向量:基底的每一个成员向量, 一般选取沿着坐标轴正方向并且长度为1的向量
任何一个向量找到同方向上模长为1的向量方法:: 向量的各成分分别除以向量的模长
坐标:对应的各个基向量前的系数
向量在不同基底上表示不同坐标
步骤
- 根据新基底, 求同方向模长为1的向量
- 原坐标分别与模长为1的新基底内积--->新基底的坐标
构成基底的条件
在n维空间中, 任意一个向量都可以表示为一组基向量的线性组合.
- 向量数量足够: 基向量的维数与个数==向量的成员数
- 满足线性无关: 其中任何一个向量都不能通过其余向量的线性组合的形式进行表示
张成空间
对于一组向量, 由它的所有线性组合所构成的空间就称为这一组向量的张成空间.
针对特定组向量而言, 这些向量可以是线性相关的
矩阵: 让向量动起来
graph LR
0{矩阵}--->1((类型))
1--行列数相等-->方阵
1--行列位置互换-->转置矩阵
转置矩阵--前后相同-->对称矩阵
1--元素全为0-->零矩阵
1--对角线上非0,其余全为0-->对角矩阵
对角矩阵--对角线上全为1-->单位矩阵
1--一维矩阵-->向量
0-->2((运算))
2--对应元素相加-->加法
2--与所有元素相乘-->数乘
2--左行右列-->矩阵与矩阵相乘
矩阵: 排列的向量, 堆放的数字: np.array()
/ np.matrix()
- 一个
的数字方阵
- n个m维列向量从左到右并排摆放
- m个n维行向量从上到下进行叠放
数学符号:
,
np.matrix('1;2;3')
'''
matrix([[1],
[2],
[3]])'''
np.matrix('3,4,5;1,2,5')
'''
matrix([[3, 4, 5],
[1, 2, 5]])'''
np.array(((3,4,5),(1,2,5)))
'''
array([[3, 4, 5],
[1, 2, 5]])'''
矩阵的类型
方阵
行列数相等的矩阵:
转置矩阵:
: A.T属性
行和列上的元素进行位置互换
np.matrix('3,4,5;1,2,5')
'''
matrix([[3, 4, 5],
[1, 2, 5]])'''
np.matrix('3,4,5;1,2,5').T
'''
matrix([[3, 1],
[4, 2],
[5, 5]])'''
对称矩阵:
原矩阵与其转置矩阵相等
零矩阵:
; np.zeros()
所有元素都是0的矩阵
np.zeros((5,3))
'''
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])'''
对角矩阵: np.diag()
非对角位置上的矩阵元素全部为0
np.diag((4,3,2,5))
'''
array([[4, 0, 0, 0],
[0, 3, 0, 0],
[0, 0, 2, 0],
[0, 0, 0, 5]])'''
单位矩阵:
: np.eye()
对角位置上元素均为1, 其余位置元素均为0的特殊对角矩阵
np.eye(5)
'''
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])'''
向量: 可以视作一维矩阵
矩阵的运算
加法: +
两矩阵对应位置上元素分别进行相加, 两个矩阵的规模必须相等.
np.eye(5)+np.ones((5,5))
'''
array([[2., 1., 1., 1., 1.],
[1., 2., 1., 1., 1.],
[1., 1., 2., 1., 1.],
[1., 1., 1., 2., 1.],
[1., 1., 1., 1., 2.]])'''
矩阵的数量乘法: *
标量数字分别矩阵的每一个元素相乘
5*np.ones((5,5))
'''
array([[5., 5., 5., 5., 5.],
[5., 5., 5., 5., 5.],
[5., 5., 5., 5., 5.],
[5., 5., 5., 5., 5.],
[5., 5., 5., 5., 5.]])'''
矩阵与矩阵的乘法: np.dot()
左边矩阵的每一行分别与右边矩阵的所有列依次内积
- 左边矩阵的列数和右边矩阵的列数相等
- 左边矩阵的行数决定了最终结果矩阵的行数
- 右边矩阵的列数决定最终结果矩阵的列数
a=5*np.ones((5,5))
a.dot(np.eye(5))
'''
array([[5., 5., 5., 5., 5.],
[5., 5., 5., 5., 5.],
[5., 5., 5., 5., 5.],
[5., 5., 5., 5., 5.],
[5., 5., 5., 5., 5.]])'''
矩阵乘以向量: 改变向量的空间位置
把列向量看成是一个列数为1的特殊矩阵
在指定矩阵的乘法作用下, 原始空间的向量被映射转换到了目标空间中的新坐标, 向量的空间位置由此发生变化, 甚至空间的维数可能会改变.
矩阵乘向量的新视角: 变换基底
本质上可看作是对向量基底的一种改变
行的角度: 多次运用向量点乘的定义式
列的角度: 重新组合矩阵的列向量
对位于原矩阵各列的列向量重新进行线性组合的过程, 而在线性组合的运算过程中, 结果中的各个系数就是参与乘法运算的列向量中所对应的各个成分.
再引申: 向量的基底的变化
旧的基底被映射到新的基底, 在基底缩放倍数(系数x,y)不变下, 描述基底改变之后的空间位置.
运算矩阵的各列就是映射后的新基底
二阶方阵
如果以向量为基底, 那么其坐标仍是(x, y);
如果以默认的向量为基底, 那么其坐标就是(ax+by, cx+dy)
扩展: 三阶方阵的情况(同二阶)
更一般地:
矩阵乘以n维列向量
关于基变换: 一些意外的情况
- 当n>m时, 显然这n个向量线性相关, 因此不构成基底.
- 当n<m时, 即使这n个向量线性无关, 由于它们不能表示m维空间中的所有向量, 因此也不能称为m维目标空间的基底
- 当且仅当n=m, 且zhen个向量线性无关时, 它们才能称为目标空间的一组新的基底.