人工智能教程(三):更多有用的 Python 庫(kù)
在本系列的 上一篇文章 中,我們回顧了人工智能的歷史,然后詳細(xì)地討論了矩陣。在本系列的第三篇文章中,我們將了解更多的矩陣操作,同時(shí)再介紹幾個(gè)人工智能 Python 庫(kù)。
在進(jìn)入主題之前,我們先討論幾個(gè)人工智能和機(jī)器學(xué)習(xí)中常用的重要術(shù)語(yǔ)。人工神經(jīng)網(wǎng)絡(luò)artificial neural network(通常簡(jiǎn)稱(chēng)為 神經(jīng)網(wǎng)絡(luò)neural network,NN)是機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的核心。顧名思義,它是受人腦的生物神經(jīng)網(wǎng)絡(luò)啟發(fā)而設(shè)計(jì)的計(jì)算模型。本文中我沒(méi)有插入神經(jīng)網(wǎng)絡(luò)模型的圖片,因?yàn)樵诨ヂ?lián)網(wǎng)上很容易找到它們。我相信任何對(duì)人工智能感興趣的人應(yīng)該都見(jiàn)過(guò)它們,左邊是輸入層,中間是一個(gè)或多個(gè)隱藏層,右邊是輸出層。各層之間的邊上的 權(quán)重weight
監(jiān)督學(xué)習(xí)supervised learning 和 無(wú)監(jiān)督學(xué)習(xí)unsupervised learning
在實(shí)際的機(jī)器學(xué)習(xí)應(yīng)用中會(huì)發(fā)生這樣的情況嗎?是的!訓(xùn)練模型用的數(shù)據(jù)集可能是不充分的或者不完整的。這是兩種模型都仍然在人工智能和機(jī)器學(xué)習(xí)領(lǐng)域蓬勃發(fā)展的眾多原因之一。在后續(xù)文章中,我們將更正式地討論它們。下面我們開(kāi)始學(xué)習(xí)使用 JupyterLab,它是一個(gè)用于開(kāi)發(fā)人工智能程序的強(qiáng)大工具。
JupyterLab 入門(mén)
在本系列的前幾篇文章中,為了簡(jiǎn)單起見(jiàn),我們一直使用 Linux 終端運(yùn)行 Python 代碼。現(xiàn)在要介紹另一個(gè)強(qiáng)大的人工智能工具——JupyterLab。在本系列的第一篇文章中,我們對(duì)比了幾個(gè)候選項(xiàng),最終決定使用 JupyterLab。它比 Jupyter Notebook 功能更強(qiáng)大,為我們預(yù)裝了許多庫(kù)和包,并且易于團(tuán)隊(duì)協(xié)作。還有一些其它原因,我們將在后續(xù)適時(shí)探討它們。
在本系列的第一篇文章中,我們已經(jīng)學(xué)習(xí)了如何安裝 JupyterLab。假設(shè)你已經(jīng)按文中的步驟安裝好了 JupyterLab,使用 jupyter lab
或 jupyter-lab
命令在會(huì)默認(rèn)瀏覽器(如 Mozilla Firefox、谷歌 Chrome 等)中打開(kāi) JupyterLab。(LCTT 譯注:沒(méi)有安裝 JupyterLab 也不要緊,你可以先 在線(xiàn)試用 JupyterLab)圖 1 是在瀏覽器中打開(kāi)的 JupyterLab 啟動(dòng)器的局部截圖。JupyterLab 使用一個(gè)名為 IPython(交互式 Python)的 Python 控制臺(tái)。注意,IPython 其實(shí)可以獨(dú)立使用,在 Linux 終端運(yùn)行 ipython
命令就可以啟動(dòng)它。
圖 1:JupyterLab 啟動(dòng)器
現(xiàn)階段我們使用 JupyterLab 中的 Jupyter Notebook 功能。點(diǎn)擊圖 1 中用綠框標(biāo)記的按鈕,打開(kāi) Jupyter Notebook。這時(shí)可能會(huì)要求你選擇內(nèi)核。如果你按照本系列第一篇的步驟安裝 JupyterLab,那么唯一的可選項(xiàng)就是 Python 3(ipykernel)。請(qǐng)注意,你還可以在 JupyterLab 中安裝其它編程語(yǔ)言的內(nèi)核,比如 C++、R、MATLAB、Julia 等。事實(shí)上 Jupyter 的內(nèi)核相當(dāng)豐富,你可以訪(fǎng)問(wèn) Jupyter 內(nèi)核清單 了解更多信息。
圖 2:Jupyter Notebook 窗口
下面我們快速了解一下 Jupyter Notebook 的使用。圖 2 顯示的是一個(gè)在瀏覽器中打開(kāi)的 Jupyter Notebook 窗口。從瀏覽器標(biāo)簽頁(yè)的標(biāo)題可以看出,Jupyter Notebook 打開(kāi)的文件的擴(kuò)展名是 .ipynb
。
在圖 2 處可以看到有三個(gè)選項(xiàng),它們表示 Jupyter Notebook 中可以使用的三種類(lèi)型的單元?!癈ode”(綠色框) 表示代碼單元,它是用來(lái)執(zhí)行代碼的?!癕arkdown” 單元可用于輸入說(shuō)明性的文本。如果你是一名計(jì)算機(jī)培訓(xùn)師,可以用代碼單元和 Markdown 單元來(lái)創(chuàng)建交互式代碼和解釋性文本,然后分享給你的學(xué)員。“Raw”(紅色框)表示原始數(shù)據(jù)單元,其中的內(nèi)容不會(huì)被格式化或轉(zhuǎn)換。
和在終端中不同,在 Jupyter Notebook 中你可以編輯并重新運(yùn)行代碼,這在處理簡(jiǎn)單的拼寫(xiě)錯(cuò)誤時(shí)特別方便。圖 3 是在 Jupyter Notebook 中執(zhí)行 Python 代碼的截圖。
圖 3:在 Jupyter Notebook 中執(zhí)行 Python 代碼
要在執(zhí)行代碼單元中的代碼,先選中該單元格,然后點(diǎn)擊藍(lán)框標(biāo)記的按鈕。圖 3 中用紅框標(biāo)記的是 Markdown 單元,用綠框標(biāo)記的是代碼單元,用黃框標(biāo)記的執(zhí)行代碼的輸出。在這個(gè)例子中,Python 代碼輸出的是 π 的值。
前面提到,JupyterLab 默認(rèn)安裝了許多庫(kù)和包,我們不用自己安裝了。你可以使用 import
命令將這些庫(kù)導(dǎo)入到代碼中。使用 !pip freeze
命令可以列出 JupyterLab 中目前可用的所有庫(kù)和包。如果有庫(kù)或包沒(méi)有安裝,大多數(shù)情況下都可以通過(guò) pip install <全小寫(xiě)的庫(kù)或者包的名稱(chēng)>
來(lái)安裝它們。例如安裝 TensorFlow 的命令是 pip install tensorflow
。如果后面有庫(kù)的安裝命令不遵循這個(gè)格式,我會(huì)進(jìn)行特別說(shuō)明。隨著本系列的繼續(xù),我們還會(huì)看到 Jupyter Notebook 和 JupyterLab 更多強(qiáng)大的功能。
復(fù)雜的矩陣運(yùn)算
通過(guò)下面的代碼,我們來(lái)了解一些更復(fù)雜的矩陣運(yùn)算或操作。為了節(jié)省空間,我沒(méi)有展示代碼的輸出。
import numpy as np
A = np.arr ay([[1,2,3],[4,5,6],[7,8,88]])
B = np.arr ay([[1,2,3],[4,5,6],[4,5,6]])
print(A.T)
print(A.T.T)
print(np.trace(A))
print(np.linalg.det(A))
C = np.linalg.inv(A)
print(C)
print(A@C)
下面我逐行來(lái)解釋這些代碼:
- 導(dǎo)入 NumPy 包。
- 創(chuàng)建矩陣
A
。 - 創(chuàng)建矩陣
B
。 - 打印矩陣
A
的轉(zhuǎn)置transpose。通過(guò)比較矩陣A
與A
的轉(zhuǎn)置,你用該可以大致理解轉(zhuǎn)置操作到底做了什么。 - 打印
A
的轉(zhuǎn)置的轉(zhuǎn)置??梢钥吹剿途仃?nbsp;A
是相同的。這又提示了轉(zhuǎn)置操作的含義。 - 打印矩陣
A
的 跡trace。跡是矩陣的對(duì)角線(xiàn)(也稱(chēng)為主對(duì)角線(xiàn))元素的和。矩陣A
的主對(duì)角線(xiàn)元素是 1、5 和 88,所以輸出的值是 94。 - 打印
A
的行列式determinant。當(dāng)執(zhí)行代碼的結(jié)果是 -237.00000000000009(在你的電腦中可能略有區(qū)別)。因?yàn)樾辛惺讲粸?0,所以稱(chēng) A 為非奇異矩陣non-singular matrix。 - 將矩陣
A
的逆inverse 保存到矩陣C
中。 - 打印矩陣
C
。 - 打印矩陣
A
和C
的乘積。仔細(xì)觀(guān)察,你會(huì)看到乘積是一個(gè)單位矩陣identity matrix,也就是一個(gè)所有對(duì)角線(xiàn)元素都為 1,所有其它元素都為 0 的矩陣。請(qǐng)注意,輸出中打印出的不是精確的 1 和 0。在我得到的答案中,有像 -3.81639165e-17 這樣的數(shù)字。這是浮點(diǎn)數(shù)的科學(xué)記數(shù)法,表示 -3.81639165 × 10-17, 即小數(shù)的 -0.0000000000000000381639165,它非常接近于零。同樣輸出中的其它數(shù)字也會(huì)有這種情況。我強(qiáng)烈建議你了解計(jì)算機(jī)是怎樣表示浮點(diǎn)數(shù)的,這對(duì)你會(huì)有很大幫助。
根據(jù)第一篇文章中的慣例,可以將代碼分成基本 Python 代碼和人工智能代碼。在這個(gè)例子中,除了第 1 行和第 9 行之外的所有代碼行都可以被看作是人工智能代碼。
現(xiàn)在將第 4 行到第 10 行的操作應(yīng)用到矩陣 B 上。從第 4 行到第 6 行代碼的輸出沒(méi)有什么特別之處。然而運(yùn)行第 7 行時(shí),矩陣 B
的行列式為 0,因此它被稱(chēng)為奇異矩陣singular matrix。運(yùn)行第 8 行代碼會(huì)給產(chǎn)生一個(gè)錯(cuò)誤,因?yàn)橹挥蟹瞧娈惥仃嚥糯嬖谀婢仃嚒D憧梢試L試對(duì)本系列前一篇文章中的 8 個(gè)矩陣都應(yīng)用相同的操作。通過(guò)觀(guān)察輸出,你會(huì)發(fā)現(xiàn)矩陣的行列式和求逆運(yùn)算只適用于方陣。
方陣就是行數(shù)和列數(shù)相等的矩陣。在上面的例子中我只是展示了對(duì)矩陣執(zhí)行各種操作,并沒(méi)有解釋它們背后的理論。如果你不知道或忘記了矩陣的轉(zhuǎn)置、逆、行列式等知識(shí)的話(huà),你最好自己學(xué)習(xí)它們。同時(shí)你也應(yīng)該了解一下不同類(lèi)型的矩陣,比如單位矩陣、對(duì)角矩陣、三角矩陣、對(duì)稱(chēng)矩陣、斜對(duì)稱(chēng)矩陣。維基百科上的相關(guān)文章是不錯(cuò)的入門(mén)。
現(xiàn)在讓我們來(lái)學(xué)習(xí)矩陣分解matrix decomposition,它是更復(fù)雜的矩陣操作。矩陣分解與整數(shù)的因子分解類(lèi)似,就是把一個(gè)矩陣被寫(xiě)成其它矩陣的乘積。下面我通過(guò)圖 4 中整數(shù)分解的例子來(lái)解釋矩陣分解的必要性。代碼單元開(kāi)頭的 %time
是 Jupyter Notebook 的魔法命令magic command,它會(huì)打印代碼運(yùn)行所花費(fèi)的時(shí)間。**
是 Python 的冪運(yùn)算符?;镜拇鷶?shù)知識(shí)告訴我們,變量 a 和 b 的值都等于 (6869 x 7873)100。但圖 4 顯示計(jì)算變量 b 的速度要快得多。事實(shí)上,隨著底數(shù)和指數(shù)的增大,執(zhí)行時(shí)間的減少會(huì)越來(lái)越明顯。
圖 4:Python 代碼的執(zhí)行耗時(shí)
在幾乎所有的矩陣分解技術(shù)技術(shù)中,原始矩陣都會(huì)被寫(xiě)成更稀疏的矩陣的乘積。稀疏矩陣sparse matrix是指有很多元素值為零的矩陣。在分解后,我們可以處理稀疏矩陣,而不是原始的具有大量非零元素的密集矩陣dense matrix。在本文中將介紹三種矩陣分解技術(shù)——LUP 分解、特征分解eigen decomposition和奇異值分解singular value decomposition(SVD)。
為了執(zhí)行矩陣分解,我們需要另一個(gè)強(qiáng)大的 Python 庫(kù),SciPy。SciPy 是基于 NumPy 庫(kù)的科學(xué)計(jì)算庫(kù),它提供了線(xiàn)性代數(shù)、積分、微分、優(yōu)化等方面的函數(shù)。首先,讓我們討論 LUP 分解。任何方陣都能進(jìn)行 LUP 分解。LUP 分解有一種變體,稱(chēng)為 LU 分解。但并不是所有方陣都能 LU 分解。因此這里我們只討論 LUP 分解。
在 LUP 分解中,矩陣 A 被寫(xiě)成三個(gè)矩陣 L、U 和 P 的乘積。其中 L 是一個(gè)下三角矩陣lower triangular matrix,它是主對(duì)角線(xiàn)以上的所有元素都為零的方陣。U 是一個(gè)上三角矩陣upper triangular matrix,它是主對(duì)角線(xiàn)以下所有元素為零的方陣。P 是一個(gè)排列矩陣permutation matrix。這是一個(gè)方陣,它的每一行和每一列中都有一個(gè)元素為 1,其它元素的值都是 0。
現(xiàn)在看下面的 LUP 分解的代碼。
import numpy as np
import scipy as sp
A=np.array([[11,22,33],[44,55,66],[77,88,888]])
P, L, U = sp.linalg.lu(A)
print(P)
print(L)
print(U)
print(P@L@U)
圖 5 顯示了代碼的輸出。第 1 行和第 2 行導(dǎo)入 NumPy 和 SciPy 包。在第 3 行創(chuàng)建矩陣 A
。請(qǐng)記住,我們?cè)诒竟?jié)中會(huì)一直使用矩陣 A
。第 4 行將矩陣 A
分解為三個(gè)矩陣——P
、L
和 U
。第 5 行到第 7 行打印矩陣 P
、L
和 U
。從圖 5 中可以清楚地看出,P
是一個(gè)置換矩陣,L
是一個(gè)下三角矩陣,U
是一個(gè)上三角矩陣。最后在第 8 行將這三個(gè)矩陣相乘并打印乘積矩陣。從圖 5 可以看到乘積矩陣 P@L@U
等于原始矩陣 A
,滿(mǎn)足矩陣分解的性質(zhì)。此外,圖 5 也驗(yàn)證了矩陣 L
、U
和 P
比矩陣 A
更稀疏。
圖 5:用 SciPy 進(jìn)行 LUP 分解
下面我們討論特征分解,它是將一個(gè)方陣是用它的特征值eigenvalue和特征向量eigenvector來(lái)表示。用 Python 計(jì)算特征值和特征向量很容易。關(guān)于特征值和特征向量的理論解釋超出了本文的討論范圍,如果你不知道它們是什么,我建議你通過(guò)維基百科等先了解它們,以便對(duì)正在執(zhí)行的操作有一個(gè)清晰的概念。圖 6 中是特征分解的代碼。
圖6:用 SciPy 進(jìn)行特征分解
在圖 6 中,第 1 行計(jì)算特征值和特征向量。第 2 行和第 3 行輸出它們。注意,使用 NumPy 也能獲得類(lèi)似的效果,Lambda, Q = np.linalg.eig(A)
。這也告訴我們 NumPy 和 SciPy 的功能之間有一些重疊。第 4 行重建了原始矩陣 A。第 4 行中的代碼片段 np.diag(Lambda)
是將特征值轉(zhuǎn)換為對(duì)角矩陣(記為 Λ
)。對(duì)角矩陣是主對(duì)角線(xiàn)以外的所有元素都為 0 的矩陣。第 4 行的代碼片段 sp.linalg.inv(Q)
是求 Q
的逆矩陣(記為 Q-1)。最后,將三個(gè)矩陣 Q
、Λ
、Q
-1 相乘得到原始矩陣 A
。也就是在特征分解中 A=QΛQ
-1。
圖 6 還顯示了執(zhí)行的代碼的輸出。紅框標(biāo)記的是特征值,用綠框標(biāo)記的是特征向量,重構(gòu)的矩陣 A 用藍(lán)框標(biāo)記。你可能會(huì)感到奇怪,輸出中像 11.+0.j 這樣的數(shù)字是什么呢?其中的 j 是虛數(shù)單位。11.+0.j 其實(shí)就是 11.0+0.0j,即整數(shù) 11 的復(fù)數(shù)形式。
現(xiàn)在讓我們來(lái)看奇異值分解(SVD),它是特征分解的推廣。圖 7 顯示了 SVD 的代碼和輸出。第 1 行將矩陣 A
分解為三個(gè)矩陣 U
、S
和 V
。第 2 行中的代碼片段 np.diag(S)
將 S
轉(zhuǎn)換為對(duì)角矩陣。最后,將這三個(gè)矩陣相乘重建原始矩陣 A
。奇異值分解的優(yōu)點(diǎn)是它可以對(duì)角化非方陣。但非方陣的奇異值分解的代碼稍微復(fù)雜一些,我們暫時(shí)不在這里討論它。
圖 7:用 SciPy 進(jìn)行 奇異值分解
其它人工智能和機(jī)器學(xué)習(xí)的 Python 庫(kù)
當(dāng)談到人工智能時(shí),普通人最先想到的場(chǎng)景可能就是電影《終結(jié)者》里機(jī)器人通過(guò)視覺(jué)識(shí)別一個(gè)人。計(jì)算機(jī)視覺(jué)computer vision是人工智能和機(jī)器學(xué)習(xí)技術(shù)被應(yīng)用得最廣泛的領(lǐng)域之一。下面我將介紹兩個(gè)計(jì)算機(jī)視覺(jué)相關(guān)的庫(kù):OpenCV 和 Matplotlib。OpenCV 是一個(gè)主要用于實(shí)時(shí)計(jì)算機(jī)視覺(jué)的庫(kù),它由 C 和 C++ 開(kāi)發(fā)。C++ 是 OpenCV 的主要接口,它通過(guò) OpenCV-Python 向用戶(hù)提供 Python 接口。Matplotlib 是基于 Python 的繪圖庫(kù)。我曾在 OSFY 上的一篇早期 文章 中詳細(xì)介紹了 Matplotlib 的使用。
前面我一直在強(qiáng)調(diào)矩陣的重要性,現(xiàn)在我用一個(gè)實(shí)際的例子來(lái)加以說(shuō)明。圖 8 展示了在 Jupyter Notebook 中使用 Matplotlib 讀取和顯示圖像的代碼和輸出。如果你沒(méi)有安裝 Matplotlib,使用 pip install matplotlib
命令安裝 Matplotlib。
圖 8:用 Matplotlib 讀取和顯示圖像
在圖 8 中,第 1 行和第 2 行從 Matplotlib 導(dǎo)入了一些函數(shù)。注意你可以從庫(kù)中導(dǎo)入單個(gè)函數(shù)或包,而不用導(dǎo)入整個(gè)庫(kù)。這兩行是基本的 Python 代碼。第 3 行從我的計(jì)算機(jī)中讀取標(biāo)題為 OSFY-Logo.jpg
的圖像。我從 OSFY 門(mén)戶(hù)網(wǎng)站的首頁(yè)下載了這張圖片。此圖像高 80 像素,寬 270 像素。第 4 行和第 5 行在 Jupyter Notebook 窗口中顯示圖像。請(qǐng)注意圖像下方用紅框標(biāo)記的兩行代碼,它的輸出告訴我們變量 image
實(shí)際上是一個(gè) NumPy 數(shù)組。具體來(lái)說(shuō),它是一個(gè) 80 x 270 x 3 的三維數(shù)組。
數(shù)組尺寸中的 80 x 270 就是圖片的大小,這一點(diǎn)很容易理解。但是第三維度表示什么呢?這是因計(jì)算機(jī)像通常用 RGB
顏色模型來(lái)存儲(chǔ)的彩色圖。它有三層,分別用于表示紅綠藍(lán)三種原色。我相信你還記得學(xué)生時(shí)代的實(shí)驗(yàn),把原色混合成不同的顏色。例如,紅色和綠色混合在一起會(huì)得到黃色。在
RGB 模型中,每種顏色的亮度用 0 到 255 的數(shù)字表示。0 表示最暗,255 表示最亮。因此值為 (255,255,255)
的像素表示純白色。
現(xiàn)在,執(zhí)行代碼 print(image)
, Jupyter Notebook
會(huì)將整個(gè)數(shù)組的一部分部分打印出來(lái)。你可以看到數(shù)組的開(kāi)頭有許多 255。這是什么原因呢?如果你仔細(xì)看 OSFY
的圖標(biāo)會(huì)發(fā)現(xiàn),圖標(biāo)的邊緣有很多白色區(qū)域,因此一開(kāi)始就印了很多 255。順便說(shuō)一句,你還可以了解一下其他顏色模型,如 CMY、CMYK、HSV
等。
現(xiàn)在我們反過(guò)來(lái)從一個(gè)數(shù)組創(chuàng)建一幅圖像。首先看圖 9 中所示的代碼。它展示了如何生成兩個(gè) 3 x 3 的隨機(jī)矩陣,它的元素是 0 到 255 之間的隨機(jī)值。注意,雖然相同的代碼執(zhí)行了兩次,但生成的結(jié)果是不同的。這是通過(guò)調(diào)用 NumPy 的偽隨機(jī)數(shù)生成器函數(shù) randint
實(shí)現(xiàn)的。實(shí)際上,我中彩票的幾率都比這兩個(gè)矩陣完全相等的幾率大得多。
圖 8:兩個(gè)隨機(jī)矩陣
接下來(lái)我們要生成一個(gè)形狀為 512 x 512 x 3 的三維數(shù)組,然后將它轉(zhuǎn)換為圖像。為此我們將用到 OpenCV。注意,安裝 OpenCV 命令是 pip install opencv-python
??聪旅娴拇a:
import cv2
img = np.random.randint(0, 256, size=(512, 512, 3))
cv2.imwrite('img.jpg', img)
第 1 行導(dǎo)入庫(kù) OpenCV。注意導(dǎo)入語(yǔ)句是 import cv2
,這與大多數(shù)其他包的導(dǎo)入不同。第 3 行將矩陣 img 轉(zhuǎn)換為名為 img.jpg
的圖像。圖
10 顯示了由 OpenCV 生成的圖像。在系統(tǒng)中運(yùn)行這段代碼,將圖像將被保存在 Jupyter Notebook
的同一目錄下。如果你查看這張圖片的屬性,你會(huì)看到它的高度是 512 像素,寬度是 512
像素。通過(guò)這些例子,很容易看出,任何處理計(jì)算機(jī)視覺(jué)任務(wù)的人工智能和機(jī)器學(xué)習(xí)程序使用了大量的數(shù)組、向量、矩陣以及線(xiàn)性代數(shù)中的思想。這也是本系列用大量篇幅介紹數(shù)組、向量和矩陣的原因。
圖 10:OpenCV 生成的圖像
最后,考慮下面顯示的代碼。image.jpg
輸出圖像會(huì)是什么樣子?我給你兩個(gè)提示。函數(shù) zeros
在第 4 行和第 5 行創(chuàng)建了兩個(gè) 512 x 512 的數(shù)組,其中綠色和藍(lán)色填充了零。第 7 行到第 9 行用來(lái)自數(shù)組 red
、green
和 blue
的值填充三維數(shù)組 img1
。
import numpy as np
import cv2
red = np.random.randint(0, 256, size=(512, 512))
green = np.zeros([512, 512], dtype=np.uint8)
blue = np.zeros([512, 512], dtype=np.uint8)
img1 = np.zeros([512,512,3], dtype=np.uint8)
img1[:,:,0] = blue
img1[:,:,1] = green
img1[:,:,2] = red
cv2.imwrite(‘image.jpg’, img1)
本期的內(nèi)容就到此結(jié)束了。在下一篇文章中,我們將開(kāi)始簡(jiǎn)單地學(xué)習(xí)張量tensor,然后安裝和使用 TensorFlow。TensorFlow 是人工智能和機(jī)器學(xué)習(xí)領(lǐng)域的重要參與者。之后,我們將暫時(shí)放下矩陣、向量和線(xiàn)性代數(shù),開(kāi)始學(xué)習(xí)概率論。概率論跟線(xiàn)性代數(shù)一樣是人工智能的重要基石。