0
点赞
收藏
分享

微信扫一扫

机器学习笔记 - 什么是稀疏矩阵?

1、什么是稀疏数据?

        当使用矩阵表示数据时,我们可以量化它包含的空值的数量。这被称为它的稀疏性。大部分包含零的矩阵(或数据集)称为稀疏矩阵。

2、一个简单的例子

        假设你让你的 4 个朋友给你 4 部不同电影的评分,从 1 到 5(如果他们没有看过,则为 0)。现在,假设您获得以下评分:

        这意味着约翰没有看过电影 1、2 和 4,但给第 3 部电影评分为 2。

        这个矩阵的稀疏度很低——准确地说是 38%(16 个值中有 6 个零 = 3/8 稀疏度),我们实际上将其称为“密集”矩阵。, 现在,想象一下你有更多的电影。假设您有 15,000 部电影(Netflix 目录的大小)。

        您可以猜到,大多数人还没有在 Netflix 上看过全部 15,000 部电影。因此,鉴于每部未看过的电影的评分为零,您可以想象这个矩阵将是多么稀疏:它主要由零组成。

3、为什么要在乎是否稀疏?

        两个原因:计算复杂性和存储。

(1)稀疏矩阵的存储

        理想情况下,我们只想存储非零值而不是整个数据集——为什么要存储大量始终具有相同值的元素?相反,我们只能存储非零元素的值。在以下示例中,我们将仅存储 [1, 2, 4, 2, 1, 5, 1, 2, 3, 1] 的值及其在矩阵中各自的位置。然后,我们知道矩阵中的所有其他值都是零,我们不需要存储它们。

稀疏矩阵的示例

(2)COO格式

        简单:您存储 3 个数组,一个用于值,一个用于每个值的行位置,一个用于每个值的列位置。这称为坐标列表 (COO) 格式。这是前面示例中 3 个数组的样子:

         等等,但要知道,我们存储了 3 个包含 11 个值的数组,因此总共有 33 个,而矩阵包含 30 个值。那有什么意义呢?

        假设您的数组包含 50 列和 10,000 行,因此有 500,000 个值。此外,它仅包含 10,000 个非零值(即 98% 稀疏)。您愿意存储 3 个包含 10,000 个值的数组,从而存储 30,000 或 500,000 个值吗?

        这几乎减少了 20 倍的存储空间。

        因此,在处理具有高稀疏性的大型数据集时,使用稀疏矩阵很高效。

(3)计算复杂度

        稀疏矩阵的第二点是在执行计算时。让我们以向量乘以矩阵为例:

具有稀疏矩阵的矩阵向量乘积

        在这里,您会看到对最终结果重要的唯一操作是我们将两个非零值相乘。但是,我们仍在执行 9 次浮点运算,而只有 3 次重要。

        理想情况下,我们希望跳过零的计算并得到一个矩阵向量乘积,其计算复杂度仅取决于矩阵的非零条目数,而不取决于值的总数。这将在实践中更好地扩展。幸运的是,大多数 ML 库都有稀疏矩阵的实现。

4、Netflix 奖

        现在让我们看一个稀疏矩阵在实践中如何有用的例子。

        从 2006 年到 2009 年,Netflix 赞助了一场比赛,以改进其电影推荐系统。他们提供了一个包含 100,480,507 个评分的训练数据集,480,189 名用户对 17,770 部电影进行了评分。

        对于每一行,您都有一个用户 ID、他们看过的电影以及他们给它的评分。目标是预测用户对特定电影的评分(使用 1-5 星系统)。

        在此示例中,我运行了以下代码。它指定了我有兴趣加载的列及其数据类型,以便以最有效的方式存储它们。

        然后,它加载数据集,重命名其列并打印出前 5 行以及内存使用情况。

加载 Netflix Prize 数据集

         这里的问题是,我们想知道用户看过哪些电影来预测他们是否会喜欢一部电影。以下是我们希望格式化数据的方式(类似于我们看到的第一个示例):

One-hot 编码我们的数据矩阵

         通过这种方式,我们将能够知道用户看过的所有电影,并使用它来预测他们会给他们没有看过的新电影打几分。

        但是,正如本文开头所讨论的,您可以想象大多数人并没有在 Netflix 上观看全部 17,770 部电影。假设人们在 Netflix 上平均观看了 150 部电影(Netflix 用户平均每周观看 3.4 部电影),在 one-hot 编码后数据集的稀疏度约为 99%。

        参考前面的示例,假设一秒钟内您已将大约 17,000 列添加到数据集中,然后将其乘以大约 1M 行以获得您添加的值的总数。你真的想存储所有这些值,知道它们是 99% 的零吗?

        相反,当调用 one-hot 编码函数(此处为 pd.get_dummies)时,我们为参数 sparse 传递了一个 true 值。这告诉 pandas 将我们的新数据存储为稀疏数组。

         与 one-hot 编码之前的 700MB 相比,内存使用量现在约为 990MB。考虑到我们添加到数据集中的值的数量,这相对较小。

5、改进 scikit-learn 代码

        正如我之前提到的,稀疏矩阵对于降低执行计算时的计算复杂度也很有用。Sklearn 的大多数算法都有稀疏实现。这是随机森林分类器文档中的一个示例:

        这里使用的CSR 格式是实践中最常用的格式,与 COO 格式接近。我解释了首席运营官,因为它对初学者更友好。

        确保在运行机器学习模型时使用稀疏矩阵可以极大地帮助加快运行时间。这在运行可能非常昂贵的网格或随机搜索时被证明更加有用。 

        在本文中,我们了解了为什么稀疏矩阵与机器学习相关,以及它们如何帮助减少数据集的存储以及运行 ML 算法的计算成本。我们还研究了如何将其应用于 Netflix 奖品数据集。

举报

相关推荐

0 条评论