本
文
摘
要
在数据科学和机器学习中,我们经常将数据表示为向量和矩阵。在数学和物理中,向量被定义大小和方向的量(例如,距离向量)。然而,通常我们处理的数据不一定会遵循向量的定义,但但我们仍然用向量来表示数据。例如,我们可以将人口统计信息(例如,种族、年龄、性别等)的数据表示为一个向量,但这没有对大小或方向的纯几何解释。
同样,在数学中,矩阵是用来表示线性映射的,它被定义为两个向量空间之间的映射,两个向量空间保留了向量加法和标量乘法。然而,在数据科学/机器学习中如何使用矩阵的上下文与这种数学定义是不同的。
既然存在这种差异,那么为什么向量和矩阵在表示数据时被如此广泛地使用呢?在本文中,我们将探讨解释这一现象的几个原因。
计算效率
在处理数据时,我们通常想要将它们输入到机器学习模型中,这个过程涉及大量的计算,通常需要对许多数字进行加法和乘法运算。例如,在构建电影推荐系统时,您可能会收集用户观看库中每部电影的时长数据。然后你可以推荐那些平均观看时间较高的电影。这个平均值是通过所有用户观看电影的时间之和除以电影的数量计算出来的。执行这一过程可能会很慢,特别是当用户和电影数量越来越多时(比如优酷,它拥有超过2.67亿的用户,拥有近2万部影片)。
然而,计算机科学家已经开发出非常高效的线性代数算法,向量和矩阵的加法和乘法比传统的基于元素的加法/乘法要快得多。对于Python,用于科学计算和线性代数的NumPy库提供了更快的速度和效率。再次回顾我们的推荐系统问题,我们可以将每个用户与一个维度为n的观看时间向量相关联,其中n是电影的数量。然后我们的数据将是这些向量的一个矩阵 *** ,有n行m列,其中n是电影的数量,m是用户的数量。为了找到要推荐的电影,我们可以沿着行取平均值,找出所有用户观看每部电影的平均时间,然后根据平均观看时间最高的电影进行排序。由于高度优化的算法,用向量和矩阵实现这个问题可以加快计算速度。
为了演示,这里有一个Python脚本,比较了使用常规 Python 和 NumPy 库(对矩阵和向量进行了优化)计算行平均值所需的时间。为了评估计算效率,我们将测量程序运行一个包含 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代码运行十次并对结果取平均值,常规 Python 耗时 9.088 毫秒,而 NumPy 耗时 0.427 毫秒。NumPy 实现比常规 Python 快大约 20 倍。
更进一步,我们在下面绘制Python和NumPy实现计算平均值的时间,同时将用户数量从1到1000进行变化,同时保持电影数量为500。
随着数据量的增加,常规Python和NumPy之间的差值会越来越大。我们还可以通过绘制两个实现之间的比率来可视化这一点。
随着数据量的增加,这个比例也在不断增加,这也证明了使用NumPy可以提高效率。对于非常大的数据来源或复杂的模型,这样效率更有价值。考虑一下越来越普遍的大数据领域,往往有数十亿到数万亿的数据点。对于深度神经网络模型,它可能由数百万个节点/参数组成,每个节点/参数的权重和偏差还要进行相乘或相加运算(例如,GPT-3语言模型有超过1750亿个参数)。
线性代数工具
使用向量/矩阵表示数据的另一个优点是,我们可以利用线性代数和数学工具。一个很好的例子是在计算机视觉中,矩阵被用来描述图像转换(例如,平移、旋转、反射、仿射、投影等)。
对于图像旋转,目标是确定一个函数,用于从图像的每个像素旋转某个角度。在线性代数中,旋转矩阵用于旋转向量/矩阵。通过将图像表示为矩阵,我们可以利用旋转矩阵。类似地,还有用于平移、反射和仿射变换的矩阵。
此外,将图像表示为矩阵也有助于进行投影变换,即从一个平面到另一个平面的线的映射。这对于图像拼接和制作全景照片很有用。此外,在处理3D图形图像时还有进一步的应用。
更加简洁
在处理复杂的数据情况时,使用向量和矩阵表示概念可以更加方便、清晰和简洁。我们可以将数据分组到指定的向量或矩阵中,而不是给每个数据点一个名称。此外,我们还可以使用向量/矩阵约定来表示对数据的操作。
例如,考虑有5个特征变量的多元线性回归的例子。这可以表示为:
使用向量/矩阵,我们可以传达相同的想法(特征和特征上的系数现在是向量):
注意,这个表示要短得多,并且仍然能捕捉到我们的线性回归模型。如果我们有更多的变量,这种表示仍然有效(对于10或1000个特征变量,它的表达式相同)。此外,向量和矩阵可以用来表示许多数据操作和模型(如逻辑回归、随机森林、神经网络等)。
此外,向量/矩阵的约定在许多领域(如物理、工程、计算等)都非常普遍。这意味着从业者通常都很熟悉,这减少了认知负担(因为他们不需要学习新的数据/模型约定)。
结论
许多数据和模型的操作用向量/矩阵表示的原因是:用向量和矩阵表示的数据可以实现高效、更快的计算,还可以使用线性代数技术。