為什么機(jī)器學(xué)習(xí)中的數(shù)據(jù)要用向量/矩陣來表示?
在數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)中,我們經(jīng)常將數(shù)據(jù)表示為向量和矩陣。在數(shù)學(xué)和物理中,向量被定義大小和方向的量(例如,距離向量)。然而,通常我們處理的數(shù)據(jù)不一定會(huì)遵循向量的定義,但但我們?nèi)匀挥孟蛄縼肀硎緮?shù)據(jù)。例如,我們可以將人口統(tǒng)計(jì)信息(例如,種族、年齡、性別等)的數(shù)據(jù)表示為一個(gè)向量,但這沒有對(duì)大小或方向的純幾何解釋。
同樣,在數(shù)學(xué)中,矩陣是用來表示線性映射的,它被定義為兩個(gè)向量空間之間的映射,兩個(gè)向量空間保留了向量加法和標(biāo)量乘法。然而,在數(shù)據(jù)科學(xué)/機(jī)器學(xué)習(xí)中如何使用矩陣的上下文與這種數(shù)學(xué)定義是不同的。
既然存在這種差異,那么為什么向量和矩陣在表示數(shù)據(jù)時(shí)被如此廣泛地使用呢?在本文中,我們將探討解釋這一現(xiàn)象的幾個(gè)原因。
計(jì)算效率
在處理數(shù)據(jù)時(shí),我們通常想要將它們輸入到機(jī)器學(xué)習(xí)模型中,這個(gè)過程涉及大量的計(jì)算,通常需要對(duì)許多數(shù)字進(jìn)行加法和乘法運(yùn)算。例如,在構(gòu)建電影推薦系統(tǒng)時(shí),您可能會(huì)收集用戶觀看庫(kù)中每部電影的時(shí)長(zhǎng)數(shù)據(jù)。然后你可以推薦那些平均觀看時(shí)間較高的電影。這個(gè)平均值是通過所有用戶觀看電影的時(shí)間之和除以電影的數(shù)量計(jì)算出來的。執(zhí)行這一過程可能會(huì)很慢,特別是當(dāng)用戶和電影數(shù)量越來越多時(shí)(比如優(yōu)酷,它擁有超過2.67億的用戶,擁有近2萬部影片)。
然而,計(jì)算機(jī)科學(xué)家已經(jīng)開發(fā)出非常高效的線性代數(shù)算法,向量和矩陣的加法和乘法比傳統(tǒng)的基于元素的加法/乘法要快得多。對(duì)于Python,用于科學(xué)計(jì)算和線性代數(shù)的NumPy庫(kù)提供了更快的速度和效率。再次回顧我們的推薦系統(tǒng)問題,我們可以將每個(gè)用戶與一個(gè)維度為n的觀看時(shí)間向量相關(guān)聯(lián),其中n是電影的數(shù)量。然后我們的數(shù)據(jù)將是這些向量的一個(gè)矩陣集合,有n行m列,其中n是電影的數(shù)量,m是用戶的數(shù)量。為了找到要推薦的電影,我們可以沿著行取平均值,找出所有用戶觀看每部電影的平均時(shí)間,然后根據(jù)平均觀看時(shí)間最高的電影進(jìn)行排序。由于高度優(yōu)化的算法,用向量和矩陣實(shí)現(xiàn)這個(gè)問題可以加快計(jì)算速度。
為了演示,這里有一個(gè)Python腳本,比較了使用常規(guī) Python 和 NumPy 庫(kù)(對(duì)矩陣和向量進(jìn)行了優(yōu)化)計(jì)算行平均值所需的時(shí)間。為了評(píng)估計(jì)算效率,我們將測(cè)量程序運(yùn)行一個(gè)包含 500 部電影和 200 個(gè)用戶的數(shù)據(jù)集所需的時(shí)間。
# import necessary libraries
import random
import numpy as np
import time
# defining the dimensions for our data
n = 500 # number of movies
m = 200 # number of users
# generating the (random) data with n rows and m columns
data = []
for _ in range(n):
data.append(random.choices(range(0, 90), k = m)) # generate random watch time
# normal array iterations to calculate the means along the rows
start_time = time.time()
averages = []
for i in range(n):
row_average = 0
for j in range(m):
row_average += data[i][j]
row_average = row_average / m
averages.append(row_average)
end_time = time.time()
total_time = end_time - start_time # time for normal array implementation
# using NumPy
np_data = np.array(data) # convert data into numpy array
np_start_time = time.time()
np_average = np.mean(np_data, axis = 1) # using numpy mean function
np_end_time = time.time()
np_total_time = np_end_time - np_start_time # time for numpy array implementation
print(f"Regular Python: {total_time:4f}; NumPy: {np_total_time:4f}") # print results
可以將Python代碼運(yùn)行十次并對(duì)結(jié)果取平均值,常規(guī) Python 耗時(shí) 9.088 毫秒,而 NumPy 耗時(shí) 0.427 毫秒。NumPy 實(shí)現(xiàn)比常規(guī) Python 快大約 20 倍。
更進(jìn)一步,我們?cè)谙旅胬L制Python和NumPy實(shí)現(xiàn)計(jì)算平均值的時(shí)間,同時(shí)將用戶數(shù)量從1到1000進(jìn)行變化,同時(shí)保持電影數(shù)量為500。
隨著數(shù)據(jù)量的增加,常規(guī)Python和NumPy之間的差值會(huì)越來越大。我們還可以通過繪制兩個(gè)實(shí)現(xiàn)之間的比率來可視化這一點(diǎn)。
隨著數(shù)據(jù)量的增加,這個(gè)比例也在不斷增加,這也證明了使用NumPy可以提高效率。對(duì)于非常大的數(shù)據(jù)來源或復(fù)雜的模型,這樣效率更有價(jià)值??紤]一下越來越普遍的大數(shù)據(jù)領(lǐng)域,往往有數(shù)十億到數(shù)萬億的數(shù)據(jù)點(diǎn)。對(duì)于深度神經(jīng)網(wǎng)絡(luò)模型,它可能由數(shù)百萬個(gè)節(jié)點(diǎn)/參數(shù)組成,每個(gè)節(jié)點(diǎn)/參數(shù)的權(quán)重和偏差還要進(jìn)行相乘或相加運(yùn)算(例如,GPT-3語言模型有超過1750億個(gè)參數(shù))。
線性代數(shù)工具
使用向量/矩陣表示數(shù)據(jù)的另一個(gè)優(yōu)點(diǎn)是,我們可以利用線性代數(shù)和數(shù)學(xué)工具。一個(gè)很好的例子是在計(jì)算機(jī)視覺中,矩陣被用來描述圖像轉(zhuǎn)換(例如,平移、旋轉(zhuǎn)、反射、仿射、投影等)。
對(duì)于圖像旋轉(zhuǎn),目標(biāo)是確定一個(gè)函數(shù),用于從圖像的每個(gè)像素旋轉(zhuǎn)某個(gè)角度。在線性代數(shù)中,旋轉(zhuǎn)矩陣用于旋轉(zhuǎn)向量/矩陣。通過將圖像表示為矩陣,我們可以利用旋轉(zhuǎn)矩陣。類似地,還有用于平移、反射和仿射變換的矩陣。
此外,將圖像表示為矩陣也有助于進(jìn)行投影變換,即從一個(gè)平面到另一個(gè)平面的線的映射。這對(duì)于圖像拼接和制作全景照片很有用。此外,在處理3D圖形圖像時(shí)還有進(jìn)一步的應(yīng)用。
更加簡(jiǎn)潔
在處理復(fù)雜的數(shù)據(jù)情況時(shí),使用向量和矩陣表示概念可以更加方便、清晰和簡(jiǎn)潔。我們可以將數(shù)據(jù)分組到指定的向量或矩陣中,而不是給每個(gè)數(shù)據(jù)點(diǎn)一個(gè)名稱。此外,我們還可以使用向量/矩陣約定來表示對(duì)數(shù)據(jù)的操作。
例如,考慮有5個(gè)特征變量的多元線性回歸的例子。這可以表示為:
使用向量/矩陣,我們可以傳達(dá)相同的想法(特征和特征上的系數(shù)現(xiàn)在是向量):?
注意,這個(gè)表示要短得多,并且仍然能捕捉到我們的線性回歸模型。如果我們有更多的變量,這種表示仍然有效(對(duì)于10或1000個(gè)特征變量,它的表達(dá)式相同)。此外,向量和矩陣可以用來表示許多數(shù)據(jù)操作和模型(如邏輯回歸、隨機(jī)森林、神經(jīng)網(wǎng)絡(luò)等)。
此外,向量/矩陣的約定在許多領(lǐng)域(如物理、工程、計(jì)算等)都非常普遍。這意味著從業(yè)者通常都很熟悉,這減少了認(rèn)知負(fù)擔(dān)(因?yàn)樗麄儾恍枰獙W(xué)習(xí)新的數(shù)據(jù)/模型約定)。
結(jié)論
許多數(shù)據(jù)和模型的操作用向量/矩陣表示的原因是:用向量和矩陣表示的數(shù)據(jù)可以實(shí)現(xiàn)高效、更快的計(jì)算,還可以使用線性代數(shù)技術(shù)。