發布時間: 2018-09-20 23:43:11
2.1 線性代數內容介紹
2.1.1 線性代數介紹
線性代數是一門被廣泛運用于各個工程技術學科的數學分支,利用線性代數的相關概念和結論,可以極大的簡化人工智能里相關公式的推導和表述。線性代數可以將復雜的問題簡單化,讓我們能夠對問題進行高效的數學運算。
在深度學習的背景下,線性代數是一個數學工具,它提供了有助于同時操作數組的技術。它提供了像向量和矩陣這樣的數據結構用來保存數字和規則,以便進行加,減,乘,除的運算。
2.1.2 代碼實現介紹
numpy 是一款基于 Python 的數值處理模塊,在處理矩陣數據方面有很強大的功能與優勢。因為線性代數的主要內容就是對矩陣的處理,所以本章節主要的內容都是基于 numpy 進行展開。另外也會涉及到方程組求解,所以也會用到數學科學庫 scipy。
2.2 線性代數實現
提前導入相應模塊。代碼如下:
>>> import numpy as np
>>> import scipy as sp
2.2.1 張量實現
生成元素全為 0 的二維張量,兩個維度分別為3,4。
# 代碼輸入:
>>> np.zeros((3,4))
# 結果輸出:
>>> np.array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
生成三維的隨機張量,三個維度分別為2,3,4。
# 代碼輸入:
>>> np.random.rand(2,3,4)
# 結果輸出:
>>> array([[[ 0.93187582, 0.4942617 , 0.23241437, 0.82237576],[ 0.90066163,0.30151126,0.89734992,0.56656615],[ 0.54487942,0.80242768,0.477167 ,0.6101814 ]],[[ 0.61176321,0.11454075,0.58316117,0.36850871],[ 0.18480808,0.12397686,0.22586973,0.35246394],[ 0.01192416,0.5990322 ,0.34527612,0.424322 ]]])2.2.2 矩陣實現
在數學中,矩陣(Matrix)是一個按照長方陣列排列的復數或實數集合,最早來自于方程組的系數及常數所構成的方陣。
創建一個 3*3 的零矩陣,矩陣這里 zeros 函數的參數是一個 tuple 類型(3,3)。
# 代碼輸入:
>>> np.mat(np.zeros((3,3)));
# 結果輸出:
>>> matrix([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
2.2.3 單位矩陣實現
單位矩陣:對角線元素均為 1,其他位置均為 0 的方陣。實現如下:
# 代碼輸入:
>>> np.eye(4)
# 結果輸出:
>>> array([[ 1., 0., 0., 0.],[ 0.,1.,0.,0.],[ 0.,0.,1.,0.],[ 0.,0.,0.,1.]])2.2.4 reshape 運算
在數學中并沒有 reshape 運算,但是在 numpy 和 TensorFlow 等運算庫中是一個非常常用的運算,用來改變一個張量的維度數和每個維度的大小,例如一個 10x10 的圖片在保存時直接保存為一個包含 100 個元素的序列,在讀取后就可以使用 reshape 將其從 1x100 變換為 10x10。示例如下:
# 代碼輸入:
# 生成一個包含整數 0~11 的向量
>>> x = np.arange(12)
>>> x
# 結果輸出:
>>> array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
# 查看數組大小
>>> x.shape
# 結果輸出:
>>>(12,)
# 將 x 轉換成二維矩陣,其中矩陣的第一個維度為 1
>>> x = x.reshape(1,12)
>>> x
# 結果輸出:
>>> array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]])
>>> x.shape
# 結果輸出:
>>>(1, 12)
# 將 x 轉換 3x4 的矩陣
>>> x = x.reshape(3,4)
>>> x
# 結果輸出:
>>> array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
2.2.5 轉置實現
向量和矩陣的轉置是交換行列順序,而三維及以上張量的轉置就需要指定轉換的維度。
# 代碼輸入:
## 生成包含5個元素的向量x并將其轉置
>>> x = np.arange(5).reshape(1,-1)
>>> x
array([[0, 1, 2, 3, 4]])
>>> x.T
array([[0],
[1],
[2],
[3],
[4]])
## 生成 3*4 的矩陣并轉置
>>> A = np.arange(12).reshape(3,4)
>>> A
# 結果輸出:
>>> array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> A.T
# 結果輸出:
>>> array([[ 0, 4, 8],[ 1,5, 9],[ 2,6, 10],[ 3,7, 11]])## 生成 2*3*4 的張量
>>> B = np.arange(24).reshape(2,3,4)
>>> B
# 結果輸出:
>>> array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
## 將 B 的 0,1 兩個維度轉置
>>> B.transpose(1,0,2)
# 結果輸出:
>>> array([[[ 0, 1, 2, 3],
[12, 13, 14, 15]],
[[ 4, 5, 6, 7],
[16, 17, 18, 19]],
[[ 8, 9, 10, 11],
[20, 21, 22, 23]]])
2.2.6 矩陣乘法實現
矩陣乘法:記兩個矩陣分別為 A 和 B,兩個矩陣能夠相乘的條件為第一個矩陣的列數等于第二個矩陣的行數。
# 代碼輸入:
>>> A = np.arange(6).reshape(3,2)
>>> B = np.arange(6).reshape(2,3)
>>> A
# 結果輸出:
>>> array([[0, 1],
[2, 3],
[4, 5]])
>>> B
# 結果輸出:
>>> array([[0, 1, 2],
[3, 4, 5]])
# 矩陣相乘
>>> np.matmul(A,B)
# 結果輸出:
>>> array([[ 3, 4, 5],
[ 9, 14, 19],
[15, 24, 33]])
2.2.7 矩陣對應運算
元素對應運算:針對形狀相同張量的運算統稱,包括元素對應相乘、相加等,即對兩個張量相同位置的元素進行加減乘除等運算。
# 代碼輸入:
# 創建矩陣
>>> A = np.arange(6).reshape(3,2)
# 矩陣相乘
>>> A*A
# 結果輸出:
>>> array([[ 0, 1],
[ 4, 9],
[16, 25]])
>>> A + A
# 結果輸出:
>>> array([[ 0, 2],
[ 4, 6],
[ 8, 10]])
2.2.8 逆矩陣實現
只有方陣才有逆矩陣,逆矩陣實現。
# 代碼輸入:
>>> A = np.arange(4).reshape(2,2)
>>> A
# 結果輸出:
>>> array([[0, 1],
[2, 3]])
>>> np.linalg.inv(A)
# 結果輸出:
>>> array([[-1.5, 0.5],
[ 1. , 0. ]])
2.2.9 特征值與特征向量
求一個矩陣的特征值和特征向量。
# 代碼輸入:
>>> import numpy as np #引入 numpy 模塊
>>> x= np.diag((1,2,3)) #寫入對角陣 x
>>> x #輸出對角陣 x
# 結果輸出:
>>> array([[1,0,0],
[0,2,0],
[0,0,3]])
>>> a,b= np.linalg.eig(x) # 特征值賦值給 a,對應特征向量賦值給 b
>>> a
# 特 征 值 1 2 3
# 結果輸出:
>>> array([1.,2.,3.])
>>> b
# 特征向量
# 結果輸出:
>>> array([1.,0.,0.],
[0.,1.,0.],
[0.,0.,1.])
2.2.10 求行列式
求一個矩陣的行列式。
# 代碼輸入:
>>> E = array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> F = array([[-1, 0, 1],
[ 2, 3, 4],
[ 5, 6, 7]])
# 結果輸出:
>>> np.linalg.det(E)
>>> 6.6613381477509402e-16
# 結果輸出:
>>> np.linalg.det(F)
>>> 2.664535259100367e-15
2.2.11 奇異值分解實現
構建一個矩陣,然后對其進行奇異值分解。
# 代碼輸入:
dataMat = [[1,1,1,0,0],
[2,2,2,0,0],
[1,1,1,0,0],
[5,5,5,0,0],
[1,1,0,2,2]]
>>> dataMat = mat(dataMat)
>>> U,Simga,VT = linalg.svd(dataMat)
>>> U
# 結果輸出:
>>> matrix([[ -1.77939726e-01, -1.64228493e-02, 1.80501685e-02, 9.53086885e-01, -3.38915095e-02, 2.14510824e-01,
1.10470800e-01],
[ -3.55879451e-01, -3.28456986e-02, 3.61003369e-02,
-5.61842993e-02, -6.73073067e-01, -4.12278297e-01, 4.94783103e-01],
[ -1.77939726e-01, -1.64228493e-02, 1.80501685e-02,
-2.74354465e-01, -5.05587078e-02, 8.25142037e-01, 4.57226420e-01],
[ -8.89698628e-01, -8.21142464e-02, 9.02508423e-02,
-1.13272764e-01, 2.86119270e-01, -4.30192532e-02,
-3.11452685e-01]])
>>> Simga
# 結果輸出:
>>>array([ 9.72140007e+00, 5.29397912e+00, 6.84226362e-01, 1.52344501e-15, 2.17780259e-16])
>>> VT
# 結果輸出:
>>> matrix([[ -5.81200877e-01, -5.81200877e-01, -5.67421508e-01,
-3.49564973e-02, -3.49564973e-02],
[ 4.61260083e-03, 4.61260083e-03, -9.61674228e-02, 7.03814349e-01, 7.03814349e-01],
[ -4.02721076e-01, -4.02721076e-01, 8.17792552e-01, 5.85098794e-02, 5.85098794e-02],
[ -7.06575299e-01, 7.06575299e-01, -2.22044605e-16, 2.74107087e-02, -2.74107087e-02],
[ 2.74107087e-02, -2.74107087e-02, 2.18575158e-16, 7.06575299e-01, -7.06575299e-01]])
2.2.12 線性方程組求解
求解線性方程組比較簡單,只需要用到一個函數(scipy.linalg.solve)就可以了。 比如我們要求以下方程的解,這是一個非齊次線性方程組:
3x_1 + x_2 - 2x_3 = 5 x_1 - x_2 + 4x_3 = -2 2x_1 + 3x_3 = 2.5
# 代碼輸入:
>>> from scipy.linalg import solve
>>> a = np.array([[3, 1, -2], [1, -1, 4], [2, 0, 3]])
>>> b = np.array([5, -2, 2.5])
>>> x = solve(a, b)
>>> x
# 結果輸出:
>>> [0.5 4.5 0.5]
上一篇: {HTML5}基礎核心-第二節-下