線性代數之向量篇
在機器學習中線性代數是及其重要的數學工具,因爲訓練數據時會進行大量的矩陣運算,所有的線性方程計算都會轉化成矩陣的計算,訓練模型時所需要的計算量是巨大的,而全部轉化爲矩陣會縮短計算的時間,極大的提升計算速度,而且很多方程只能通過向量化的形式來解,代數與幾何密不可分,可以相互的轉化,這也正是數學的魅力所在。
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)))