深度學習的表現之所以能夠超過傳統的機器學習算法離不開神經網絡,然而神經網絡最基本的數據結構就是向量和矩陣,神經網絡的輸入是向量,然後通過每個矩陣對向量進行線性變換,再經過激活函數的非線性變換,通過層層計算最終使得損失函數的最小化,完成模型的訓練。所以要想學好深度學習,對這些基礎的數據結構還是要非常了解的。
标量标量(scalar):一個标量就是一個單獨的數(整數或實數),不同于線性代數中研究的其他大部分對象(通常是多個數的數組)。标量通常用斜體的小寫字母來表示,例如:
标量
标量就相當于Python中定義的
x = 1
向量(vector):一個向量表示一組有序排列的數,通過次序中的索引我們能夠找到每個單獨的數,向量通常用粗體的小寫字母表示,例如:
向量
向量中的每個元素就是一個标量,向量中的第i個元素用
表示,向量相當于Python中的一維數組
import numpy as np
#行向量
a = np.array([1,2,3,4])
矩陣(matrix):矩陣是一個二維數組,其中的每一個元素由兩個索引來決定A(i,j),矩陣通常用加粗斜體的大寫字母表示,例如:
矩陣
我們可以将矩陣看做是一個二維的數據表,矩陣的每一行表示一個對象,每一列表示一個特征。在Python中的定義為
import numpy as np
#矩陣
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
張量(tensor):超過二維的數組,一般來說,一個數組中的元素分布在若幹維坐标的規則網格中,被稱為張量。如果一個張量是三維數組,那麼我們就需要三個索引來決定元素的位置A(i,j,k),張量通常用加粗的大寫字母表示,例如:
張量
import numpy as np
#張量
a = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
通過上面的介紹可以總結一下,标量是0維空間中的一個點,向量是一維空間中的一條線,矩陣是二維空間的一個面,三維張量是三維空間中的一個體。也就是說,向量是由标量組成的,矩陣是向量組成的,張量是矩陣組成的。
用一個比較通俗的例子可以概括為:假設你手中拿着一根棍子,标量就是我們隻知道棍子的長度,但是不知道棍子指向的方向。向量就是我們除了知道棍子的長度之外還知道棍子指向的是左邊還是右邊,矩陣就是除了知道向量知道的信息外還知道棍子是朝上還是朝下,張量就是除了知道矩陣知道的信息外還知道棍子是朝前還是朝後。
線性代數常用的運算一、向量的運算1.點積點積(dot product)又被稱為數量積(scalar product)或者内積(inner product):是指接受在實數R上的兩個向量并返回一個實數值标量的二元運算。
代數意義
import numpy as np
a = np.array([1,2,3])
b = np.array([3,2,1])
#向量的點積運算
print(np.dot(a,b))#10
這個運算可以簡單地理解為:在點積運算中,第一個向量投影到第二個向量上(這裡,向量的順序是不重要的,點積運算是可交換的),然後通過除以它們的标量長度來“标準化”。這樣,這個分數一定是小于等于1的,可以簡單地轉化成一個角度值。利用向量積的幾何意義,我們可以用來計算兩個向量之間的夾角。
2.外積
import numpy as np
a = np.array([0,2])
b = np.array([3,3])
#向量的外積
c = np.cross(b,a)
print(c)
通過外積我們可以用來快速求解平行四邊形或三角形的面積,需要注意的是在計算向量積時候,向量之間的順序,順序相反會得到相反的結果(正數和負數),判斷方向時采用右手定則。
3.向量的範數
轉置(transpose):是矩陣的重要操作之一。矩陣的轉置是以對角線為軸的鏡像,這條從左上角到右下角的對角線被稱為主對角線(main diagonal)。如下圖所示
其實就是将原矩陣的行變成了轉置矩陣的列或将原矩陣的列變成轉置矩陣的行。
2.矩陣的範數
矩陣乘法:是最常見的矩陣乘積,兩個矩陣相乘,必須要滿足前一個矩陣的列數等于後一個矩陣的行數,一個m×p的矩陣乘以一個p×n會得到一個m×n的矩陣。運算規則如下
numpy的實現如下,和向量積一樣
import numpy as np
a = np.array([[1,2,3],
[-1,3,-2]])
b = np.array([[1,2],
[3,4],
[1,3]])
#矩陣相乘
print(np.dot(a,b))#或者使用np.matmul(a,b)
"""
[[10 19]
[ 6 4]]
"""
哈達馬積(Hadamard product):也叫矩陣的元素相乘,矩陣對應元素相乘,兩個矩陣在進行元素相乘的時候必須要有相同的行數和列數,計算公式如下
在Python中計算兩個矩陣元素相乘的乘積直接相乘即可,如果兩個相乘的矩陣行數和列數不相等會報錯,相乘的時候其中一個可以是标量或向量,會自動使用廣播,标量乘以矩陣中的所有元素,相當于對矩陣的元素做一個縮放
import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[2,2],[1,3]])
#矩陣的元素相乘
c = a * b
print(c)
"""
[[ 2 4]
[ 3 12]]
"""
#矩陣的廣播
d = a * 2
print(d)
"""
[[2 4]
[6 8]]
"""
d = a * np.array([1,2])
print(d)
"""
[[1 4]
[3 8]]
"""
克羅内克積(Kronecker Product):克羅内克積是兩個任意大小的矩陣間的運算,符号記作⊗ 。克羅内克積也被稱為直積或張量積。計算過程如下例所示:
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!