摘要:提到線性代數(shù),又不得不吐槽國(guó)內(nèi)教材了,學(xué)起來(lái)真的是實(shí)力勸退。線性代數(shù)概念較多,計(jì)劃在另一篇總結(jié)基本概念,這里僅總結(jié)線性代數(shù)里一些重要概念的程序。
提到線性代數(shù),又不得不吐槽國(guó)內(nèi)教材了,學(xué)起來(lái)真的是實(shí)力勸退。有多少跟著國(guó)內(nèi)教材學(xué)完線性代數(shù)課程后,知道線性代數(shù)是什么,它到底是干什么的?
事實(shí)上如果你后面想做科研、想研究機(jī)器學(xué)習(xí)、深度學(xué)習(xí),你會(huì)發(fā)現(xiàn)處處是線性代數(shù)。這么抽象又重要的課程,一本書(shū)里基本看不到幾張圖,就好比是沒(méi)有注釋的代碼,大概以為我的腦子就是記公式的機(jī)器吧…
如果你還未開(kāi)始學(xué)習(xí)線性代數(shù),那么強(qiáng)烈建議你把學(xué)校發(fā)的紫色教材放在一邊,找?guī)妆緡?guó)外的線性代數(shù)教材看看。然后在B站里搜一下麻省理工公開(kāi)課Gilbert Strang老爺子的線性代數(shù)視頻,相信你會(huì)打開(kāi)新世界的大門(mén)(文末有彩蛋)——
吐槽就到這,我們先來(lái)看一個(gè)涉及線性代數(shù)本質(zhì)問(wèn)題的式子:
y = A x y=Ax y=Ax
可以說(shuō),線性代數(shù)的很多問(wèn)題都是從這個(gè)式子出發(fā)的。那么在線性代數(shù)中,如何理解這個(gè)式子呢?
直觀上看,這個(gè)式子跟我們熟悉的一次函數(shù) y = kx比較像。對(duì)于y=kx,我們可以理解為將標(biāo)量x經(jīng)過(guò) 某種線性變換,得到另一個(gè)標(biāo)量y。
這里,我們把x和y換成向量,對(duì)于y = Ax,我們可以理解為將矩陣A(線性變換)作用于向量x ,得到另一個(gè)向量y。
由于向量就是空間中的一個(gè)點(diǎn),這個(gè)種線性變換的作用就是將空間中的一個(gè)點(diǎn)變?yōu)榭臻g中的另一個(gè)點(diǎn)。
對(duì)于函數(shù)y=kx,如果我們知道y和k,就能夠求解出x。對(duì)于y=Ax也一樣,如果y和A已知,我們同樣可以求出x,這就是求解線性方程組的問(wèn)題了。
其他知識(shí)點(diǎn)都是從這些基本的概念衍生出來(lái)的,這里就不一一列舉了。任何新知識(shí)都不是憑空出來(lái)的,都是建立在以前的理論基礎(chǔ)之上。在學(xué)習(xí)數(shù)學(xué)的時(shí)候,可以多聯(lián)系以前的知識(shí),類比著學(xué)習(xí)。
線性代數(shù)概念較多,計(jì)劃在另一篇總結(jié)基本概念,這里僅總結(jié)線性代數(shù)里一些重要概念的python程序。
1 矩陣基本操作
注:向量操作與矩陣類似。
1.1 創(chuàng)建矩陣
(1)通過(guò)列表創(chuàng)建矩陣
#通過(guò)列表創(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)通過(guò)元組創(chuàng)建矩陣
#通過(guò)元組創(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ù)隨機(jī)生成矩陣中指定范圍的浮點(diǎn)數(shù):
import numpy as npa1 = np.random.random((3,4)) #3×4階,取值范圍為0~1print(a1)
randint()函數(shù)隨機(jī)生成矩陣中指定范圍的整數(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("通過(guò)eye()創(chuàng)建五階單位矩陣e1: /n",e1)print("通過(guò)identity()創(chuàng)建五階單位矩陣e2: /n",e2)
(2)零矩陣
import numpy as npa = np.zeros((3,4)) print("3×4階零矩陣a: /n",a)
(3)對(duì)角矩陣
import numpy as npm = [1,2,3,4,5]a = np.diag(m)print("創(chuàng)建對(duì)角線為1,2,3,4,5的對(duì)角矩陣: /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 矩陣運(yùn)算
(1)矩陣加減法運(yùn)算
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ù)乘運(yùn)算
import numpy as npm = [[5,5,5],[6,6,6]]a = np.array(m)print("矩陣數(shù)乘2a = /n",2*a)
(3)矩陣乘法運(yùn)算
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("對(duì)應(yīng)元素的乘積: /n",a5)print("對(duì)應(yīng)元素的乘積: /n",a6)
(4)矩陣乘方運(yùn)算
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)行列式是一個(gè)數(shù)值,矩陣是一個(gè)數(shù)表;
(2)行列式的行數(shù)等于列數(shù),矩陣的行數(shù)不等于列數(shù)。
2.2 計(jì)算行列式
(1)使用np.linalg.det()函數(shù)計(jì)算行列式
官方手冊(cè)用法:
python程序:
#計(jì)算行列式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ù)計(jì)算行列式
官方手冊(cè)用法:
python程序:
# 計(jì)算行列式dfrom scipy import linalgd = [[1, 2, -4],[-2, 2, 1],[-3, 4, -2]]a = np.array(d)linalg.det(a)
2.3 計(jì)算矩陣的秩
使用np.linalg.matrix_rank() 函數(shù)計(jì)算矩陣的秩。
官方手冊(cè)用法:
python程序:
# 計(jì)算矩陣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 向量基本運(yùn)算
3.1 向量的內(nèi)積
python程序:
# 計(jì)算向量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 向量的長(zhǎng)度
使用np.linalg.norm()函數(shù):
官方手冊(cè)用法:
python程序:
# 計(jì)算向量v的長(zhǎng)度import numpy as np v = [[1,2,2]]a = np.array(v)result =np.linalg.norm(a)print(result) #3
4 計(jì)算線性方程組的解
(1)使用np.linalg.solve()函數(shù)
官方手冊(cè)用法:
注意:這里系數(shù)矩陣必須是滿秩,即所有行必須是線性無(wú)關(guān)的。
python程序:
#計(jì)算線性方程組的解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ù)
官方手冊(cè)用法(內(nèi)容有點(diǎn)長(zhǎng)):
https://docs.scipy.org/doc/scipy/reference/reference/generated/scipy.linalg.solve.html#scipy.linalg.solve
python程序:
#計(jì)算線性方程組的解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 計(jì)算特征值與特征向量
使用np.linalg.eig()函數(shù):
官方手冊(cè)用法:
python程序:
# 計(jì)算特征值和特征向量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) #特征值對(duì)角化print("對(duì)角矩陣:",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要點(diǎn)
SVD(Singular Value Decompostion)可以對(duì)任意矩陣進(jìn)行分解,它是一種抽取重要特征的方法,將一個(gè)復(fù)雜的大矩陣用三個(gè)小矩陣來(lái)表示,而這三個(gè)小矩陣包含大矩陣的重要特征信息。
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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/119315.html
摘要:值得一提的是每篇文章都是我用心整理的,編者一貫堅(jiān)持使用通俗形象的語(yǔ)言給我的讀者朋友們講解機(jī)器學(xué)習(xí)深度學(xué)習(xí)的各個(gè)知識(shí)點(diǎn)。今天,紅色石頭特此將以前所有的原創(chuàng)文章整理出來(lái),組成一個(gè)比較合理完整的機(jī)器學(xué)習(xí)深度學(xué)習(xí)的學(xué)習(xí)路線圖,希望能夠幫助到大家。 一年多來(lái),公眾號(hào)【AI有道】已經(jīng)發(fā)布了 140+ 的原創(chuàng)文章了。內(nèi)容涉及林軒田機(jī)器學(xué)習(xí)課程筆記、吳恩達(dá) deeplearning.ai 課程筆記、機(jī)...
摘要:數(shù)據(jù)科學(xué)其實(shí)就是機(jī)器學(xué)習(xí),數(shù)據(jù)分析和數(shù)據(jù)可視化。機(jī)器學(xué)習(xí)通過(guò)實(shí)現(xiàn)算法,該算法能夠自動(dòng)檢測(cè)輸入中的模式。一般應(yīng)用于人臉識(shí)別語(yǔ)音識(shí)別熱門(mén)機(jī)器學(xué)習(xí)算法包括神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)支持向量機(jī)隨機(jī)森林進(jìn)行數(shù)據(jù)分析可視化進(jìn)行數(shù)據(jù)可視化時(shí),是非常熱門(mén)的庫(kù)。 ...
摘要:最后還是強(qiáng)調(diào)一下自學(xué)的重要性,深度學(xué)習(xí)及其分支都是一個(gè)大坑,知識(shí)量巨大,希望大家充分利用搜索引擎對(duì)已學(xué)知識(shí)點(diǎn)進(jìn)行補(bǔ)充或解疑,觀摩大佬們的代碼,不要滿足于這小小的系列 【DL-CV】計(jì)算機(jī)視覺(jué)前置了解 showImg(https://segmentfault.com/img/bVbeOwJ?w=1464&h=1000); 閑了就要找事做,不能被四公主和NS誘惑。所以在搞完了爬蟲(chóng)進(jìn)入假期時(shí)...
閱讀 1962·2021-11-16 11:45
閱讀 3673·2021-09-06 15:02
閱讀 2021·2019-08-30 15:44
閱讀 2289·2019-08-30 11:21
閱讀 1851·2019-08-29 16:31
閱讀 3425·2019-08-29 13:55
閱讀 1898·2019-08-29 12:15
閱讀 3253·2019-08-28 18:05