為什么機器學習中的數據要用向量/矩陣來表示?
在數據科學和機器學習中,我們經常將數據表示為向量和矩陣。在數學和物理中,向量被定義大小和方向的量(例如,距離向量)。然而,通常我們處理的數據不一定會遵循向量的定義,但但我們仍然用向量來表示數據。例如,我們可以將人口統(tǒng)計信息(例如,種族、年齡、性別等)的數據表示為一個向量,但這沒有對大小或方向的純幾何解釋。
同樣,在數學中,矩陣是用來表示線性映射的,它被定義為兩個向量空間之間的映射,兩個向量空間保留了向量加法和標量乘法。然而,在數據科學/機器學習中如何使用矩陣的上下文與這種數學定義是不同的。
既然存在這種差異,那么為什么向量和矩陣在表示數據時被如此廣泛地使用呢?在本文中,我們將探討解釋這一現(xiàn)象的幾個原因。
計算效率
在處理數據時,我們通常想要將它們輸入到機器學習模型中,這個過程涉及大量的計算,通常需要對許多數字進行加法和乘法運算。例如,在構建電影推薦系統(tǒng)時,您可能會收集用戶觀看庫中每部電影的時長數據。然后你可以推薦那些平均觀看時間較高的電影。這個平均值是通過所有用戶觀看電影的時間之和除以電影的數量計算出來的。執(zhí)行這一過程可能會很慢,特別是當用戶和電影數量越來越多時(比如優(yōu)酷,它擁有超過2.67億的用戶,擁有近2萬部影片)。
然而,計算機科學家已經開發(fā)出非常高效的線性代數算法,向量和矩陣的加法和乘法比傳統(tǒng)的基于元素的加法/乘法要快得多。對于Python,用于科學計算和線性代數的NumPy庫提供了更快的速度和效率。再次回顧我們的推薦系統(tǒng)問題,我們可以將每個用戶與一個維度為n的觀看時間向量相關聯(lián),其中n是電影的數量。然后我們的數據將是這些向量的一個矩陣集合,有n行m列,其中n是電影的數量,m是用戶的數量。為了找到要推薦的電影,我們可以沿著行取平均值,找出所有用戶觀看每部電影的平均時間,然后根據平均觀看時間最高的電影進行排序。由于高度優(yōu)化的算法,用向量和矩陣實現(xiàn)這個問題可以加快計算速度。
為了演示,這里有一個Python腳本,比較了使用常規(guī) Python 和 NumPy 庫(對矩陣和向量進行了優(yōu)化)計算行平均值所需的時間。為了評估計算效率,我們將測量程序運行一個包含 500 部電影和 200 個用戶的數據集所需的時間。
# 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代碼運行十次并對結果取平均值,常規(guī) Python 耗時 9.088 毫秒,而 NumPy 耗時 0.427 毫秒。NumPy 實現(xiàn)比常規(guī) Python 快大約 20 倍。
更進一步,我們在下面繪制Python和NumPy實現(xiàn)計算平均值的時間,同時將用戶數量從1到1000進行變化,同時保持電影數量為500。
隨著數據量的增加,常規(guī)Python和NumPy之間的差值會越來越大。我們還可以通過繪制兩個實現(xiàn)之間的比率來可視化這一點。
隨著數據量的增加,這個比例也在不斷增加,這也證明了使用NumPy可以提高效率。對于非常大的數據來源或復雜的模型,這樣效率更有價值??紤]一下越來越普遍的大數據領域,往往有數十億到數萬億的數據點。對于深度神經網絡模型,它可能由數百萬個節(jié)點/參數組成,每個節(jié)點/參數的權重和偏差還要進行相乘或相加運算(例如,GPT-3語言模型有超過1750億個參數)。
線性代數工具
使用向量/矩陣表示數據的另一個優(yōu)點是,我們可以利用線性代數和數學工具。一個很好的例子是在計算機視覺中,矩陣被用來描述圖像轉換(例如,平移、旋轉、反射、仿射、投影等)。
對于圖像旋轉,目標是確定一個函數,用于從圖像的每個像素旋轉某個角度。在線性代數中,旋轉矩陣用于旋轉向量/矩陣。通過將圖像表示為矩陣,我們可以利用旋轉矩陣。類似地,還有用于平移、反射和仿射變換的矩陣。
此外,將圖像表示為矩陣也有助于進行投影變換,即從一個平面到另一個平面的線的映射。這對于圖像拼接和制作全景照片很有用。此外,在處理3D圖形圖像時還有進一步的應用。
更加簡潔
在處理復雜的數據情況時,使用向量和矩陣表示概念可以更加方便、清晰和簡潔。我們可以將數據分組到指定的向量或矩陣中,而不是給每個數據點一個名稱。此外,我們還可以使用向量/矩陣約定來表示對數據的操作。
例如,考慮有5個特征變量的多元線性回歸的例子。這可以表示為:
使用向量/矩陣,我們可以傳達相同的想法(特征和特征上的系數現(xiàn)在是向量):?
注意,這個表示要短得多,并且仍然能捕捉到我們的線性回歸模型。如果我們有更多的變量,這種表示仍然有效(對于10或1000個特征變量,它的表達式相同)。此外,向量和矩陣可以用來表示許多數據操作和模型(如邏輯回歸、隨機森林、神經網絡等)。
此外,向量/矩陣的約定在許多領域(如物理、工程、計算等)都非常普遍。這意味著從業(yè)者通常都很熟悉,這減少了認知負擔(因為他們不需要學習新的數據/模型約定)。
結論
許多數據和模型的操作用向量/矩陣表示的原因是:用向量和矩陣表示的數據可以實現(xiàn)高效、更快的計算,還可以使用線性代數技術。