1.1 線性代數(shù)內(nèi)容介紹
1.1.1 線性代數(shù)介紹
線性代數(shù)是一門(mén)被廣泛運(yùn)用于各工程技術(shù)領(lǐng)域的學(xué)科。用線性代數(shù)的相關(guān)概念和結(jié)論,可以極大地簡(jiǎn)化數(shù)據(jù)挖掘中相關(guān)公式的推導(dǎo)和表述。線性代數(shù)將復(fù)雜的問(wèn)題簡(jiǎn)單化,讓我們能夠?qū)?wèn)題進(jìn)行高效地?cái)?shù)學(xué)運(yùn)算。
線性代數(shù)是一個(gè)數(shù)學(xué)工具,它不僅提供了有助于操作數(shù)組的技術(shù),還提供了像向量和矩陣這樣的數(shù)據(jù)結(jié)構(gòu)用來(lái)保存數(shù)字和規(guī)則,以便進(jìn)行加,減,乘,除的運(yùn)算。
1.1.2 代碼實(shí)現(xiàn)介紹
numpy是一款基于Python的數(shù)值處理模塊,在處理矩陣數(shù)據(jù)方面有很強(qiáng)大的功能與優(yōu)勢(shì)。因?yàn)榫€性代數(shù)的主要內(nèi)容就是對(duì)矩陣的處理,所以本章節(jié)主要的內(nèi)容都是基于numpy進(jìn)行展開(kāi)。另外也會(huì)涉及到方程組求解,所以也會(huì)用到數(shù)學(xué)科學(xué)庫(kù)scipy。
1.2 線性代數(shù)實(shí)現(xiàn)
導(dǎo)入相應(yīng)庫(kù):
import numpy as np
import scipy as sp
1.2.1 reshape運(yùn)算
在數(shù)學(xué)中并沒(méi)有 reshape
運(yùn)算,但是在numpy運(yùn)算庫(kù)中是一個(gè)非常常用的運(yùn)算,用來(lái)改變一個(gè)張量的維度數(shù)和每個(gè)維度的大小,例如一個(gè)10x10的圖片在保存時(shí)直接保存為一個(gè)包含100個(gè)元素的序列,在讀取后就可以使用reshape將其從 1x100
變換為 10x10
。
示例如下:
生成一個(gè)包含整數(shù)0~11的向量
x = np.arange(12)
print(x)
結(jié)果輸出:
[ 0 1 2 3 4 5 6 7 8 9 10 11]
注意:如果是直接np.arange(12),輸出結(jié)果為:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
擴(kuò)展學(xué)習(xí):
如果是想要以逗號(hào)進(jìn)行隔開(kāi)方式打印x,則可以指定一下:
new_x = np.array2string(x, separator = ",")
print(new_x)
輸出結(jié)果為:
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11]
但是需要注意的是,此處打印的是str類(lèi)型。
查看數(shù)組大小:
x.shape
結(jié)果輸出:
(12,)
將x轉(zhuǎn)換成二維矩陣,其中矩陣的第一個(gè)維度為1:
x = x.reshape(1,12)
print(x)
結(jié)果輸出:
[[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]]
查看數(shù)組大小
x.shape
結(jié)果輸出:
(1, 12)
將x轉(zhuǎn)換3x4的矩陣
x = x.reshape(3,4)
print(x)
結(jié)果輸出:
[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]
1.2.2 轉(zhuǎn)置實(shí)現(xiàn)
向量和矩陣的轉(zhuǎn)置是交換行列順序,而三維及以上張量的轉(zhuǎn)置就需要指定轉(zhuǎn)換的維度。
生成3*4的矩陣:
A = np.arange(12).reshape(3,4)
print(A)
結(jié)果輸出:
[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]
轉(zhuǎn)置:
A.T
結(jié)果輸出:
array([[ 0, 4, 8],
? [ 1, 5, 9],
? [ 2, 6, 10],
? [ 3, 7, 11]])
1.2.3 矩陣乘法實(shí)現(xiàn)
矩陣乘法:記兩個(gè)矩陣分別為A和B,兩個(gè)矩陣能夠相乘的條件為第一個(gè)矩陣的 列數(shù)
等于第二個(gè)矩陣的 行數(shù)
。
代碼輸入:
A = np.arange(6).reshape(3,2)
print(A)
結(jié)果輸出:
[[0 1]
[2 3]
[4 5]]
B = np.arange(6).reshape(2,3)
print(B)
結(jié)果輸出:
[[0, 1, 2],
[3, 4, 5]]
矩陣相乘:
np.matmul(A,B)
注意:不要寫(xiě)成 A.matmul(B)
,也不能寫(xiě)成 A*B
。
結(jié)果輸出:
array([[ 3, 4, 5],
? [ 9, 14, 19],
? [15, 24, 33]])
1.2.4 矩陣對(duì)應(yīng)運(yùn)算
元素對(duì)應(yīng)運(yùn)算:針對(duì)形狀相同矩陣的運(yùn)算統(tǒng)稱(chēng),包括元素對(duì)應(yīng)相乘、相加等,即對(duì)兩個(gè)矩陣相同位置的元素進(jìn)行加減乘除等運(yùn)算。
創(chuàng)建矩陣:
A = np.arange(6).reshape(3,2)
矩陣相乘:
print(A*A)
結(jié)果輸出:
array([[ 0, 1],
? [ 4, 9],
? [16, 25]])
矩陣相加:
rint(A + A)
結(jié)果輸出:
array([[ 0, 2],
? [ 4, 6],
? [ 8, 10]])
1.2.5 逆矩陣實(shí)現(xiàn)
只有方陣才有 逆矩陣
,逆矩陣實(shí)現(xiàn)。
代碼輸入:
A = np.arange(4).reshape(2,2)
print(A)
結(jié)果輸出:
array([[0, 1],
? [2, 3]])
求逆矩陣:
np.linalg.inv(A)
結(jié)果輸出:
array([[-1.5, 0.5],
? [ 1. , 0. ]])
注意:此處是 np.linalg
!不是scipy.linalg
。可以自行了解如何求逆,此處不做過(guò)多解釋。
提示:設(shè)A是數(shù)域上的一個(gè)n階方陣,若在相同數(shù)域上存在另一個(gè)n階矩B,使得: AB=BA=E
。 則我們稱(chēng)B是A的逆矩陣,而A則被稱(chēng)為可逆矩陣。其中,E為單位矩陣。
說(shuō)明:np.linalg
和 scipy.linalg
在提供線性代數(shù)函數(shù)方面有些重疊,但也存在一些區(qū)別。如果您只需要基本的線性代數(shù)功能,np.linalg足以滿(mǎn)足您的需求。如果需要更高級(jí)的線性代數(shù)功能或特定的分解方法,您可能需要查看scipy.linalg中的函數(shù)。SciPy是建立在NumPy之上的科學(xué)計(jì)算庫(kù),提供了更廣泛的數(shù)學(xué)、科學(xué)和工程計(jì)算功能。
如果是使用scipy的linalg
代碼如下:
from scipy import linalg
linalg.inv(A)
輸出結(jié)果為:
array([[-1.5, 0.5],
[ 1. , 0. ]])
1.2.6 特征值與特征向量
當(dāng)談?wù)摼仃嚨?特征值
和 特征向量
時(shí),我們首先需要了解 線性變換
和 向量空間
的概念。
-
線性變換是指將一個(gè)向量空間中的向量映射到另一個(gè)向量空間中的向量的操作。在二維平面上的旋轉(zhuǎn)和縮放、三維空間中的投影等都是線性變換的例子。
-
向量空間是指由多個(gè)向量組成的集合,其中的向量可以進(jìn)行加法和數(shù)乘運(yùn)算。向量空間可以是二維平面、三維空間或更高維度的空間。
現(xiàn)在,我們來(lái)解釋矩陣的特征值和特征向量:
-
特征值(Eigenvalues)是一個(gè)數(shù)值,表示線性變換作用后的向量在同一方向上的縮放倍數(shù)。當(dāng)一個(gè)向量在經(jīng)過(guò)線性變換后,只發(fā)生縮放而不改變方向時(shí),這個(gè)縮放倍數(shù)就是特征值。
-
特征向量(Eigenvectors)是與特征值相關(guān)聯(lián)的向量。它是表示在線性變換下保持在同一方向上的向量。特征向量不會(huì)改變方向,而是在線性變換后僅僅以特征值的倍數(shù)進(jìn)行縮放。
具體來(lái)說(shuō),對(duì)于一個(gè)n維向量空間中的線性變換,我們可以表示為一個(gè)n×n的矩陣A。如果存在一個(gè)非零向量v和一個(gè)標(biāo)量λ,使得下式成立:
A * v = λ * v
其中,v是 特征向量
,λ是 特征值
。這意味著當(dāng)矩陣A作用在特征向量v上時(shí),結(jié)果只是將v進(jìn)行了縮放,縮放的比例由特征值λ確定。
特征值和特征向量對(duì)于矩陣的理解和分析非常重要。它們提供了關(guān)于矩陣在線性變換過(guò)程中的行為和性質(zhì)的信息。通過(guò)計(jì)算矩陣的特征值和特征向量,我們可以了解線性變換的縮放效果和主要方向,并在許多應(yīng)用中提供有用的洞察力,如主成分分析、圖像處理和振動(dòng)分析等。
接下來(lái)進(jìn)行求矩陣的 特征值
與 特征向量
并實(shí)現(xiàn)可視化。
導(dǎo)入相應(yīng)庫(kù):
from scipy.linalg import eig
import numpy as np
import matplotlib.pyplot as plt
求特征值與特征向量:
A = [[1, 2],#生成一個(gè)2*2的矩陣
[2, 1]]
evals, evecs = eig(A) #求A的特征值(evals)和特征向量(evecs)
evecs = evecs[:, 0], evecs[:, 1]
plt.subplots()
返回一個(gè)Figure實(shí)例fig 和一個(gè) AxesSubplot實(shí)例ax。fig代表整個(gè)圖像,ax代表坐標(biāo)軸和畫(huà)的圖。 作圖:
fig, ax = plt.subplots()
輸出圖片如下:
讓坐標(biāo)軸經(jīng)過(guò)原點(diǎn):
for spine in ['left', 'bottom']:#讓在左下角的坐標(biāo)軸經(jīng)過(guò)原點(diǎn)
ax.spines[spine].set_position('zero')
畫(huà)出網(wǎng)格:
ax.grid(alpha=0.4)
設(shè)置坐標(biāo)軸的范圍:
xmin, xmax = -3, 3
ymin, ymax = -3, 3
ax.set(xlim=(xmin, xmax), ylim=(ymin, ymax))
輸出結(jié)果為:
[(-3.0, 3.0), (-3.0, 3.0)]
畫(huà)出 特征向量
。用一個(gè)箭頭指向要注釋的地方,再寫(xiě)上一段話的行為,叫做annotate。text是輸入內(nèi)容;xy:箭頭指向;xytext文字所處的位置;arrowprops通過(guò)arrowstyle表明箭頭的風(fēng)格或種類(lèi):
for v in evecs:
ax.annotate(text="", xy=v, xytext=(0, 0),
arrowprops=dict(facecolor='blue',
shrink=0,
alpha=0.6,
width=0.5))
注意:
問(wèn)題原因:annotate()的’s’參數(shù)自Matplotlib 3.3以后已重命名為’text’,不能使用s,不然會(huì)報(bào)錯(cuò)。
畫(huà)出 特征空間
:
x = np.linspace(xmin, xmax, 3)#在指定的間隔內(nèi)返回均勻間隔的數(shù)字
for v in evecs:
a = v[1] / v[0] #沿特征向量方向的單位向量
ax.plot(x, a * x, 'r-', lw=0.4)# 參數(shù) lw 表示圖線的粗細(xì)
plt.show()
可視化圖像:
藍(lán)箭頭向量為特征向量,兩條紅色直線組成的空間為特征空間。
1.2.7 求行列式
求一個(gè)矩陣的行列式。
代碼輸入:
E = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
print(np.linalg.det(E))
np.linalg.det()
是NumPy庫(kù)中的一個(gè)函數(shù),用于計(jì)算矩陣的 行列式
。在這里,我們將矩陣E作為參數(shù)傳遞給np.linalg.det()
函數(shù)
結(jié)果輸出:
-9.51619735392994e-16
擴(kuò)展閱讀:
圖說(shuō)行列式:幾張圖讓你明白行列式的性質(zhì)
行列式的幾何意義
總結(jié):其實(shí)一個(gè)行列式的幾何意義是有向線段(一階行列式)或有向面積(二階行列式)或有向體積(高階行列式)。
1.2.8 奇異值分解實(shí)現(xiàn)
接下來(lái)利用奇異值分解(Singular Value Decomposition,SVD),通過(guò)文章標(biāo)題出現(xiàn)的關(guān)鍵詞,對(duì)文章進(jìn)行聚類(lèi)。
導(dǎo)入相應(yīng)模塊:
import numpy as np
import matplotlib.pyplot as plt
輸入關(guān)鍵字:
words = ["books","dad","stock","value","singular","estate","decomposition"]
設(shè)已知8個(gè)標(biāo)題,7個(gè)關(guān)鍵字。記錄每個(gè)標(biāo)題中每個(gè)關(guān)鍵字出現(xiàn)的次數(shù),得矩陣X。 X中每一行表示一個(gè)標(biāo)題,每一列表示一個(gè)關(guān)鍵字,矩陣中的每個(gè)元素表示一個(gè)關(guān)鍵字中一個(gè)標(biāo)題中出現(xiàn)的次數(shù)。
X=np.array([[0,2,1,0,0,0,0],[2,0,0,1,0,1,0],[1,0,0,0,0,0,1],[0,0,1,0,0,0,0],[0,1,0,0,0,0,0],[0,0,0,1,1,0,1],[0,1,0,0,1,0,0],[0,0,0,0,1,1,1]])
進(jìn)行奇異值分解:
U,s,Vh=np.linalg.svd(X)
輸出左奇異矩陣U:
print("U=",U)
輸出結(jié)果:
U= [[-1.87135757e-01 -7.93624528e-01 2.45011855e-01 -2.05404352e-01
-3.88578059e-16 5.75779114e-16 -2.57394431e-01 -4.08248290e-01]
[-6.92896814e-01 2.88368077e-01 5.67788037e-01 2.22142537e-01
2.54000254e-01 -6.37019839e-16 -2.21623012e-02 2.05865892e-17]
[-3.53233681e-01 1.22606651e-01 3.49203461e-02 -4.51735990e-01
-7.62000762e-01 1.27403968e-15 2.72513448e-01 3.80488702e-17]
[-2.61369658e-02 -1.33189110e-01 7.51079037e-02 -6.44727454e-01
5.08000508e-01 1.77635684e-15 3.68146235e-01 4.08248290e-01]
[-8.04993957e-02 -3.30217709e-01 8.49519758e-02 2.19661551e-01
-2.54000254e-01 -4.81127681e-16 -3.12770333e-01 8.16496581e-01]
[-3.95029694e-01 1.56123876e-02 -5.28290830e-01 -6.82340484e-02
1.27000127e-01 -7.07106781e-01 -2.09360158e-01 1.55512464e-17]
[-2.02089013e-01 -3.80395849e-01 -2.12899198e-01 4.80790894e-01
8.04483689e-16 -1.60632798e-15 7.33466480e-01 1.76241226e-16]
[-3.95029694e-01 1.56123876e-02 -5.28290830e-01 -6.82340484e-02
1.27000127e-01 7.07106781e-01 -2.09360158e-01 -1.23226632e-16]]
輸出奇異值矩陣:
print("s=",s)
按每個(gè)奇異值一一對(duì)應(yīng)一個(gè)左奇異向量和一個(gè)右奇異向量奇異值從大到小排列輸出結(jié)果:
s= [2.85653844 2.63792139 2.06449303 1.14829917 1. 1.
0.54848559]
輸出右奇異矩陣Vh:
print("Vh",Vh)
輸出結(jié)果:
Vh [[-6.08788345e-01 -2.29949618e-01 -7.46612474e-02 -3.80854846e-01
-3.47325416e-01 -3.80854846e-01 -4.00237243e-01]
[ 2.65111314e-01 -8.71088358e-01 -3.51342402e-01 1.15234846e-01
-1.32365989e-01 1.15234846e-01 5.83153945e-02]
[ 5.66965547e-01 1.75382762e-01 1.55059743e-01 1.91316736e-02
-6.14911671e-01 1.91316736e-02 -4.94872736e-01]
[-6.48865369e-03 2.52237176e-01 -7.40339999e-01 1.34031699e-01
2.99854608e-01 1.34031699e-01 -5.12239408e-01]
[-2.54000254e-01 -2.54000254e-01 5.08000508e-01 3.81000381e-01
2.54000254e-01 3.81000381e-01 -5.08000508e-01]
[ 0.00000000e+00 -7.68640544e-16 2.33583082e-15 -7.07106781e-01
-1.21802199e-15 7.07106781e-01 1.91457709e-15]
[ 4.16034348e-01 -1.71550021e-01 2.01922906e-01 -4.22112199e-01
5.73845817e-01 -4.22112199e-01 -2.66564648e-01]]
規(guī)定坐標(biāo)軸的范圍:
plt.axis([-0.8,0.2,-0.8,0.8])
輸出圖像為:
原每個(gè)關(guān)鍵字由 1*8
的向量表示,現(xiàn)降維成 1*2
的向量以便進(jìn)行可視化
for i in range(len(words)):
plt.text(U[i,0],U[i,1],words[i])
plt.show()
可視化結(jié)果:
這張圖是奇異值分解(SVD)的結(jié)果。奇異值分解是一種在線性代數(shù)中常用的矩陣分解方法,它將一個(gè)矩陣分解為三個(gè)矩陣的乘積,這三個(gè)矩陣分別代表了旋轉(zhuǎn)、縮放和另一次旋轉(zhuǎn)。在這張圖中,每個(gè)點(diǎn)代表一個(gè)單詞,它們的位置是通過(guò)奇異值分解得到的。這種分解方法可以幫助我們理解數(shù)據(jù)的結(jié)構(gòu)和關(guān)系。
將到2維可視化后,我們可以將關(guān)鍵詞聚類(lèi),如singular和decomposition距離比較近可以被劃分為一組。
擴(kuò)展閱讀:
2分鐘看懂奇異值分解
什么是奇異值分解SVD–SVD如何分解時(shí)空矩陣
補(bǔ)充:奇異值是特征值的開(kāi)根。
1.2.9 線性方程組求解
求解線性方程組比較簡(jiǎn)單,只需要用到一個(gè)函數(shù) scipy.linalg.solve()
就可以了。
比如我們對(duì)膠片中矩陣章節(jié)中的部門(mén)月度跑步案例進(jìn)行線性方程組求解,線性方程組如下:
10x_1 + 8x_2 + 12x_3 = 20
4x_1 + 4x_2 + 2x_3 = 8
2x_1 - 4x_2- 2x_3 = -5
代碼輸入:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-762879.html
from scipy.linalg import solve
a = np.array([[10, 8, 12], [4, 4, 2], [2, -4, -2]])
b = np.array([20,8,-5])
x = solve(a, b)
print(x)
結(jié)果輸出:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-762879.html
[0.5 1.3125 0.375 ]
到了這里,關(guān)于大數(shù)據(jù)HCIE成神之路之?dāng)?shù)學(xué)(2)——線性代數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!