线性代数之向量篇
在机器学习中线性代数是及其重要的数学工具,因为训练数据时会进行大量的矩阵运算,所有的线性方程计算都会转化成矩阵的计算,训练模型时所需要的计算量是巨大的,而全部转化为矩阵会缩短计算的时间,极大的提升计算速度,而且很多方程只能通过向量化的形式来解,代数与几何密不可分,可以相互的转化,这也正是数学的魅力所在。
1. 向量
1.1 定义
在数学中,向量(也称为欧几里得向量、几何向量、矢量),指具有大小和方向的量。
代数表示:ab
矩阵表示:
a=[x1x2]=⟨x1,x2⟩(1)
向量的模:向量的大小称为向量的模,是个标量,没有方向。
表示为:∣a∣=x12+x22
n维空间:用 Rn表示,向量在某一个维度上的值称为向量在该维度上的分量。如R3空间的向量 a=⟨1,3,5⟩,则a在三个维度上的分量分别是 1,3,5。
零向量:所有分量都为0的向量,单位向量:模长等于1的向量 ,计算公式 一个非零向量除以它的模,即 N=∣a∣a
1.2 向量的运算
加法:
a=[−12],b=[34],a+b=[−1+32+4]=[26](2)
数乘:
a=[12],a×3=[36],a×(−3)=[−3−6](3)
减法:
a=[33],b=[−1−1],a−b=a+(−1)×b=[44](4)
1.3 向量与方程组
一个方程组可以分解为一个向量的混合运算。例如:
{3x+2y=7−6x+6y=6⇒a[3−6]x+b[26]y=c[76]⇒ax+by=c(5)
{x=1y=2⇒a+2b=c(6)
1.4 向量的点积
如果A和B都是n维向量,它们的点积就是二者的分量的乘积之和。
代数意义:A⋅B=∑i=1naibi
几何意义:A=⟨a1,a2⟩,B=⟨b1,b2⟩A⋅B=a1b1+a2b2=∣A∣∣B∣cosθ
点积的作用:1.计算向量间的夹角,2.判断正交性,3.求向量的分量
1.5 向量的叉积
二维空间内定义:A=[a1a2],B=[b1b2],A×B=a1b1a2b2=a1b2−a2b1
三维空间内定义:
A=⎣⎡a1a2a3⎦⎤,B=⎣⎡b1b2b3⎦⎤,A×B=i^a1b1j^a2b2k^a3b3=a1b2−a2b1=⟨i^a2b2a3b3,−j^a1b1a3b3,k^a1b1a2b2⟩
&\hat{i},&\hat{j},&\hat{k}代表每个维度的单位向量,行列式是一个函数,它的代表的是一个标量。叉积的结果是一个向量,这点要非常清晰。
几何意义:∣A×B∣=∣A∣∣B∣sinθ,即两个向量的叉积的模长等于这两个向量模长的积乘以二者夹角的正弦。
叉积的作用:1.计算平行六面体的体积,2.判断点是否共面,3.计算法向量
2. 行列式
2.1 定义
定义:对于n维空间的行列式,可以表示为:Dn=∣An×n∣=det(An×n),其中A是一个n阶方阵。
2.2 性质
- 单位矩阵的行列式为1
- 如果Dn=det(A)的某行的元素全为0,那么Dn=0
- 如果Dn=det(A)中某两行元素对应成比例,那么Dn=0
- 如果Dn=det(A)中某两行元素互换,那么互换后的行列式变号,即det(A)=−det(A)
- 倍乘性质 ,行列式A中某行(或列)用同一数k乘,其结果等于kA,det(kAn×n)=kndet(An×n)
- 倍加性质:
a1b1a2b2=a1b1+ka1a2b2+ka2
- 单行可拆性:从左到右是加,从右到左是拆
a1b1a2b2+a1c1a2bc=a1c1+b1a2c2+b2
- 以上所有作用于行的性质都可以适用于列上
- 两个矩阵相乘的行列式,等于这个两个矩阵的行列式相乘 det(AB)=det(A)det(B)
2.3 行列式的意义
行列式是由向量组成的,当det(A)=0时,组成det(A)的向量全部独立,此时,方程组有唯一解。
1324=0→{x1+x2=03x1+4x2=0
2.4 行列式的计算
det(U)=d1d2d3…dn=∏i=1ndi
det(A)=∑n!±a1αa2βa3γ⋯anϖ
2.5 代数余子式
代数余子式的核心思想是把一个复杂的高阶行列式转换为多个简单的低阶行列式
det(A)=a11(a22a33−a23a32)−a12(a21a33−a23a31)+a13(a21a32−a22a31)
det(A)=a11C11+a12C12+⋯+a1nC1n=∑i=1na1iC1i
3. python代码
import numpy as np
if __name__ == '__main__':
a = np.array([-1, 2, 3])
b = np.array([3, 1, 4])
a_add_b = a + b
a_sub_b = a - b
a_mul_b = a * b
a_inner_b = np.inner(a, b)
a_cross_b = np.cross(a, b)
print(a_add_b, a_sub_b, a_mul_b, a_inner_b, a_cross_b)
c = np.mat('1 2;3 3')
d = np.mat('2 2 1; 1 0 1; 0 2 1')
det_c = np.linalg.det(c)
det_d = np.linalg.det(d)
print('c={0}\n D(c)={1}'.format(c,np.round(det_c)))
print('d={0}\n D(d)={1}'.format(d,np.round(det_d)))