摘要:提到線性代數(shù),又不得不吐槽國內(nèi)教材了,學(xué)起來真的是實力勸退。線性代數(shù)概念較多,計劃在另一篇總結(jié)基本概念,這里僅總結(jié)線性代數(shù)里一些重要概念的程序。
提到線性代數(shù),又不得不吐槽國內(nèi)教材了,學(xué)起來真的是實力勸退。有多少跟著國內(nèi)教材學(xué)完線性代數(shù)課程后,知道線性代數(shù)是什么,它到底是干什么的?
事實上如果你后面想做科研、想研究機器學(xué)習(xí)、深度學(xué)習(xí),你會發(fā)現(xiàn)處處是線性代數(shù)。這么抽象又重要的課程,一本書里基本看不到幾張圖,就好比是沒有注釋的代碼,大概以為我的腦子就是記公式的機器吧…
如果你還未開始學(xué)習(xí)線性代數(shù),那么強烈建議你把學(xué)校發(fā)的紫色教材放在一邊,找?guī)妆緡獾木€性代數(shù)教材看看。然后在B站里搜一下麻省理工公開課Gilbert Strang老爺子的線性代數(shù)視頻,相信你會打開新世界的大門(文末有彩蛋)——
吐槽就到這,我們先來看一個涉及線性代數(shù)本質(zhì)問題的式子:
y = A x y=Ax y=Ax
可以說,線性代數(shù)的很多問題都是從這個式子出發(fā)的。那么在線性代數(shù)中,如何理解這個式子呢?
直觀上看,這個式子跟我們熟悉的一次函數(shù) y = kx比較像。對于y=kx,我們可以理解為將標(biāo)量x經(jīng)過 某種線性變換,得到另一個標(biāo)量y。
這里,我們把x和y換成向量,對于y = Ax,我們可以理解為將矩陣A(線性變換)作用于向量x ,得到另一個向量y。
由于向量就是空間中的一個點,這個種線性變換的作用就是將空間中的一個點變?yōu)榭臻g中的另一個點。
對于函數(shù)y=kx,如果我們知道y和k,就能夠求解出x。對于y=Ax也一樣,如果y和A已知,我們同樣可以求出x,這就是求解線性方程組的問題了。
其他知識點都是從這些基本的概念衍生出來的,這里就不一一列舉了。任何新知識都不是憑空出來的,都是建立在以前的理論基礎(chǔ)之上。在學(xué)習(xí)數(shù)學(xué)的時候,可以多聯(lián)系以前的知識,類比著學(xué)習(xí)。
線性代數(shù)概念較多,計劃在另一篇總結(jié)基本概念,這里僅總結(jié)線性代數(shù)里一些重要概念的python程序。
1 矩陣基本操作
注:向量操作與矩陣類似。
1.1 創(chuàng)建矩陣
(1)通過列表創(chuàng)建矩陣
#通過列表創(chuàng)建矩陣import numpy as npm = [[1,2,3],[4,5,6],[7,8,9]] a1 = np.array(m)print("a1:",a1)print("a1的大?。? ,a1.shape)print("a1的類型:",type(a1))
(2)通過元組創(chuàng)建矩陣
#通過元組創(chuàng)建矩陣t = ((1,2,3),(4,5,6),(7,8,9)) a2 = np.array(t)print("a2:",t)print("a2的大小:" ,a2.shape)print("a2的類型:",type(a2))
(3)使用random()和randint()函數(shù)
random()函數(shù)隨機生成矩陣中指定范圍的浮點數(shù):
import numpy as npa1 = np.random.random((3,4)) #3×4階,取值范圍為0~1print(a1)
randint()函數(shù)隨機生成矩陣中指定范圍的整數(shù):
a2 = np.random.randint(1,10,size=[3,4]) #3×4階,取值范圍為1~10(不包括10)print(a2)
1.2 改變矩陣的大小
import numpy as npm = [1,2,3,4,5,6,7,8,9,10,11,12]a = np.array(m)a1 = a.reshape(3,4)a2 = a.reshape(4,3)print("原矩陣a: /n",a)print("轉(zhuǎn)換為3行4列矩陣a1:/n",a1)print("轉(zhuǎn)換為4行3列矩陣a2:/n",a2)
1.3 獲取矩陣元素
print("a2的第0行元素a2[0]: /n",a2[0])print("a2的前2行元素a2[0:2]: /n",a2[0:2])print("a2的第0行和第2行元素a2[[0,2]]: /n",a2[[0,2]])print("a2的第0列元素a2[:,1]: /n",a2[:,1])print("a2的前2行元素a2[:,0:2]: /n",a2[:,0:2])print("a2的第0列和第2列元素a2[:,[0,2]]: /n",a2[:,[0,2]])print("a2的第2行第2列元素a2[2,2]: /n",a2[2,2])
1.4 特殊矩陣生成
(1)單位矩陣
import numpy as npe1 = np.eye(5)e2 = np.identity(5)print("通過eye()創(chuàng)建五階單位矩陣e1: /n",e1)print("通過identity()創(chuàng)建五階單位矩陣e2: /n",e2)
(2)零矩陣
import numpy as npa = np.zeros((3,4)) print("3×4階零矩陣a: /n",a)
(3)對角矩陣
import numpy as npm = [1,2,3,4,5]a = np.diag(m)print("創(chuàng)建對角線為1,2,3,4,5的對角矩陣: /n",a)
(4)上三角矩陣和下三角矩陣
import numpy as npm = [[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]]a = np.array(m)a1 = np.triu(a,0)a2 = np.tril(a,0)print("a矩陣:/n",a)print("a矩陣的上三角矩陣: /n",a1)print("a矩陣的下三角矩陣: /n",a2)
1.5 矩陣運算
(1)矩陣加減法運算
import numpy as npm1 = [[1,1,1],[2,2,2]]m2 = [[3,3,3],[4,4,4]]a1 = np.array(m1)a2 = np.array(m2)print("a1 + a2 = /n",a1 + a2)print("a1 - a2 = /n",a1 - a2)
(2)矩陣數(shù)乘運算
import numpy as npm = [[5,5,5],[6,6,6]]a = np.array(m)print("矩陣數(shù)乘2a = /n",2*a)
(3)矩陣乘法運算
import numpy as npa1 = np.array([[1,1,1],[2,2,2],[3,3,3]])a2 = np.array([[4,4,4],[5,5,5],[6,6,6]])a3 = np.dot(a1,a2)a4 = a1.dot(a2)a5 = a1*a2a6 = np.multiply(a1,a2)print("矩陣乘法a1×a2 = /n",a3)print("矩陣乘法a1×a2 = /n",a4)print("對應(yīng)元素的乘積: /n",a5)print("對應(yīng)元素的乘積: /n",a6)
(4)矩陣乘方運算
import numpy as npm = [[1,1,1],[2,2,2],[3,3,3]]a = np.array(m)a1 = a**2print("a的二次方a1: /n",a1)
(5)生成逆矩陣
import numpy as npm = [[2,5],[2,3]]a = np.array(m)a1 = np.linalg.inv(a)a2 = np.mat(a)a3 = a2.Iprint("使用np.linalg.inv()求a的逆矩陣a1: /n",a1)print("使用I屬性求a的逆矩陣a3: /n",a3)
(6)生成轉(zhuǎn)置矩陣
import numpy as npm = [[1,2,3],[4,5,6]]a = np.array(m)a1 = a.Ta2 = np.transpose(a)print("使用T屬性求a的轉(zhuǎn)置a1: /n",a1)print("使用np.transpose()函數(shù)求a的轉(zhuǎn)置a2: /n",a2)
2 行列式
2.1 行列式與矩陣的區(qū)別
(1)行列式是一個數(shù)值,矩陣是一個數(shù)表;
(2)行列式的行數(shù)等于列數(shù),矩陣的行數(shù)不等于列數(shù)。
2.2 計算行列式
(1)使用np.linalg.det()函數(shù)計算行列式
官方手冊用法:
python程序:
#計算行列式dimport numpy as npd = [[1, 2, -4],[-2, 2, 1],[-3, 4, -2]]a = np.array(d)result = np.linalg.det(a) print(result) #-14.000000000000004
(2)使用scipy.linalg.det()函數(shù)計算行列式
官方手冊用法:
python程序:
# 計算行列式dfrom scipy import linalgd = [[1, 2, -4],[-2, 2, 1],[-3, 4, -2]]a = np.array(d)linalg.det(a)
2.3 計算矩陣的秩
使用np.linalg.matrix_rank() 函數(shù)計算矩陣的秩。
官方手冊用法:
python程序:
# 計算矩陣d的秩import numpy as npm = [[2, -1, -1, 1, 2],[1, 1, -2, 1, 4],[4, -6, 2, -2, 4],[3, 6, -9, 7, 9]]a = np.array(m)rank = np.linalg.matrix_rank(m)print(rank) #3
3 向量基本運算
3.1 向量的內(nèi)積
python程序:
# 計算向量v1與向量v2的內(nèi)積import numpy as npv1 = [[1,1,1]]v2 = [[1,-2,1]]a1 = np.array(v1).reshape(3,1)a2 = np.array(v2).reshape(3,1)result = a1.T.dot(a2)print(result) #[[0]]
3.2 向量的長度
使用np.linalg.norm()函數(shù):
官方手冊用法:
python程序:
# 計算向量v的長度import numpy as np v = [[1,2,2]]a = np.array(v)result =np.linalg.norm(a)print(result) #3
4 計算線性方程組的解
(1)使用np.linalg.solve()函數(shù)
官方手冊用法:
注意:這里系數(shù)矩陣必須是滿秩,即所有行必須是線性無關(guān)的。
python程序:
#計算線性方程組的解import numpy as np l1 = [[3, 2, -3],[2, -3, 3],[1, -1, 2]]l2 = [[-2, 5, 5]]a1 = np.array(l1)a2 = np.array(l2).reshape(3,1)result = np.linalg.solve(a1,a2)print(result)
(2)使用scipy.linalg.solve()函數(shù)
官方手冊用法(內(nèi)容有點長):
https://docs.scipy.org/doc/scipy/reference/reference/generated/scipy.linalg.solve.html#scipy.linalg.solve
python程序:
#計算線性方程組的解from scipy import linalgl1 = [[3, 2, -3],[2, -3, 3],[1, -1, 2]]l2 = [[-2, 5, 5]]a1 = np.array(l1)a2 = np.array(l2).reshape(3,1)result = linalg.solve(a1,a2)print(result)
5 特征值與特征向量
5.1 計算特征值與特征向量
使用np.linalg.eig()函數(shù):
官方手冊用法:
python程序:
# 計算特征值和特征向量import numpy as npm = [[3,-1],[-1,3]]a = np.array(m)eig_val,eig_vex = np.linalg.eig(a)print(eig_val) print(eig_vex)
輸出
特征值: [4. 2.]特征向量: [[ 0.70710678 0.70710678] [-0.70710678 0.70710678]]
5.2 特征值分解
特征值分解要求帶分解的矩陣必須是n維方陣。
python程序:
import numpy as npm1 = [[-2, 1, 1],[0, 2, 0],[-4, 1, 3]] #m1為原始矩陣a = np.array(m1)eig_val,eig_vex = np.linalg.eig(a)print("特征值為:",eig_val)eig_val_diag = np.diag(eig_val) #特征值對角化print("對角矩陣:",eig_val_diag)m2 = eig_vex.dot(eig_val_diag.dot(np.linalg.inv(eig_vex))) #m2為新生成的矩陣print(m2)print("m1和m2是否相等:",np.allclose(m1,m2))
6 SVD
6.1 SVD要點
SVD(Singular Value Decompostion)可以對任意矩陣進(jìn)行分解,它是一種抽取重要特征的方法,將一個復(fù)雜的大矩陣用三個小矩陣來表示,而這三個小矩陣包含大矩陣的重要特征信息。
6.2 使用SVD重構(gòu)矩陣
python程序:
#奇異值分解import numpy as npm1 = [[1, 2, 2, 1],[2, 1, -2, -2],[1, -1, -4, -3]] # 原矩陣m1a = np.array(m1)u,s,vt = np.linalg.svd(a) diagma = np.zeros(np.shape(a))diagma[:len(s),:len(s)] = np.diag(s)print("左奇異值矩陣: /n",u) print("奇異值: /n",s)print("右奇異值矩陣: /n",vt)print("奇異值矩陣: /n",diagma)m2 = u.dot(diagma.dot(vt)) # 重構(gòu)后的矩陣m2print("原矩陣m1與重構(gòu)后矩陣m2是否相同:",np.allclose(m1,m2)) #判斷重構(gòu)后矩陣與原矩陣是否相等
輸出:
左奇異值矩陣: [[-0.34819307 -0.73853115 0.57735027] [ 0.4654902 -0.67080962 -0.57735027] [ 0.81368327 0.06772153 0.57735027]]奇異值: [6.38092733e+00 3.04692736e+00 1.50350788e-16]右奇異值矩陣: [[ 0.21885073 -0.16370335 -0.76510817 -0.58302235] [-0.66047812 -0.72715663 -0.13335703 0.13125468] [ 0.28819959 -0.02107189 -0.52371947 0.80138311] [-0.65788602 0.66633357 -0.35006188 0.02534264]]奇異值矩陣: [[6.38092733e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] [0.00000000e+00 3.04692736e+00 0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00 1.50350788e-16 0.00000000e+00]]原矩陣m1與重構(gòu)后矩陣m2是否相同: True
6.3 使用SVD進(jìn)行矩陣近似
for k in range(3
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/119315.html
摘要:值得一提的是每篇文章都是我用心整理的,編者一貫堅持使用通俗形象的語言給我的讀者朋友們講解機器學(xué)習(xí)深度學(xué)習(xí)的各個知識點。今天,紅色石頭特此將以前所有的原創(chuàng)文章整理出來,組成一個比較合理完整的機器學(xué)習(xí)深度學(xué)習(xí)的學(xué)習(xí)路線圖,希望能夠幫助到大家。 一年多來,公眾號【AI有道】已經(jīng)發(fā)布了 140+ 的原創(chuàng)文章了。內(nèi)容涉及林軒田機器學(xué)習(xí)課程筆記、吳恩達(dá) deeplearning.ai 課程筆記、機...
摘要:數(shù)據(jù)科學(xué)其實就是機器學(xué)習(xí),數(shù)據(jù)分析和數(shù)據(jù)可視化。機器學(xué)習(xí)通過實現(xiàn)算法,該算法能夠自動檢測輸入中的模式。一般應(yīng)用于人臉識別語音識別熱門機器學(xué)習(xí)算法包括神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)支持向量機隨機森林進(jìn)行數(shù)據(jù)分析可視化進(jìn)行數(shù)據(jù)可視化時,是非常熱門的庫。 ...
摘要:最后還是強調(diào)一下自學(xué)的重要性,深度學(xué)習(xí)及其分支都是一個大坑,知識量巨大,希望大家充分利用搜索引擎對已學(xué)知識點進(jìn)行補充或解疑,觀摩大佬們的代碼,不要滿足于這小小的系列 【DL-CV】計算機視覺前置了解 showImg(https://segmentfault.com/img/bVbeOwJ?w=1464&h=1000); 閑了就要找事做,不能被四公主和NS誘惑。所以在搞完了爬蟲進(jìn)入假期時...
閱讀 1967·2021-11-16 11:45
閱讀 3682·2021-09-06 15:02
閱讀 2027·2019-08-30 15:44
閱讀 2291·2019-08-30 11:21
閱讀 1856·2019-08-29 16:31
閱讀 3429·2019-08-29 13:55
閱讀 1905·2019-08-29 12:15
閱讀 3256·2019-08-28 18:05