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 奖品数据集。

机器学习笔记 - 什么是稀疏矩阵?相关推荐

  1. 一份520页的机器学习笔记!附下载链接

    点击上方"视学算法",选择"星标"公众号 第一时间获取价值内容 近日,来自SAP(全球第一大商业软件公司)的梁劲(Jim Liang)公开了自己所写的一份 52 ...

  2. 700 页的机器学习笔记火了!完整版开放下载

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 作者       梁劲(Jim Liang),来自SAP(全球第一大商业软件公司). 书籍特点       条理清晰 ...

  3. 机器学习笔记十四:随机森林

    在上一篇机器学习笔记十三:Ensemble思想(上)中,简要的提了一下集成学习的原理和两种主要的集成学习形式.  而在这部分要讲的随机森林,就算是其中属于bagging思路的一种学习方法.为了篇幅,b ...

  4. 机器学习笔记七:损失函数与风险函数

    一.损失函数 回顾之前讲过的线性回归模型,我们为了要学习参数使得得到的直线更好的拟合数据,我们使用了一个函数 这个函数就是比较模型得到的结果和"真实值"之间的"差距&qu ...

  5. 吴恩达机器学习笔记55-异常检测算法的特征选择(Choosing What Features to Use of Anomaly Detection)

    吴恩达机器学习笔记55-异常检测算法的特征选择(Choosing What Features to Use of Anomaly Detection) 对于异常检测算法,使用特征是至关重要的,下面谈谈 ...

  6. Python机器学习笔记:sklearn库的学习

    自2007年发布以来,scikit-learn已经成为Python重要的机器学习库了,scikit-learn简称sklearn,支持包括分类,回归,降维和聚类四大机器学习算法.还包括了特征提取,数据 ...

  7. 神经网络与机器学习 笔记—LMS(最小均方算法)和学习率退火

    神经网络与机器学习 笔记-LMS(最小均方算法)和学习率退火 LMS算法和Rosenblatt感知器算法非常想,唯独就是去掉了神经元的压制函数,Rosenblatt用的Sgn压制函数,LMS不需要压制 ...

  8. 神经网络与机器学习 笔记—基本知识点(下)

                   神经网络与机器学习 笔记-基本知识点(下) 0.1 网络结构: 神经网络中神经元的构造方式与用于训练网络的学习算法有着密切的联系,有三种基本的网络结构: 0.7 知识表示 ...

  9. 神经网络与机器学习 笔记—基本知识点(上)

    神经网络与机器学习 笔记-基本知识点(上) 0.1 什么是神经网络: 神经网络是由简单处理单元构成的大规模并行分布处理器,天然具有存储经验知识和使之可用的特性.神经网络在两个方面与大脑类似. 神经网络 ...

最新文章

  1. python无穷大整数_python的特殊数字类型(无穷大、无穷小等)
  2. 获取固件加载基地址的几种方法
  3. 一个平行四边形可以分成四个_【八年级下】数学 平行四边形(3)菱形
  4. 堆排序java实例_堆排序(示例代码)
  5. JDK源码(18)-System
  6. mysql 乱码问题
  7. Eclipse配Tomcat服务器
  8. Ubuntu下RabbitMQ安装
  9. 内存模拟块设备驱动程序设计
  10. 阿里这份Java程序性能优化指南,让你的程序快上200%
  11. 2.2大数据采集技术
  12. 《计算智能导论》下载
  13. 吴恩达-deep learning 02.改善深层神经网络:优化算法 (Optimization algorithms)Week2
  14. 详解FindBugs的各项检测器
  15. Kafka消息偏移量的演变
  16. flink java快速上手
  17. oracle子查询嵌套查询
  18. 微信小程序 上传图片
  19. Simpsons’ Hidden Talents(扩展KMP)
  20. Markdown 15 款顶级笔记软件测评推荐

热门文章

  1. JavaScript 本地存储、sessionStorage和localStorage
  2. 【Java学习】2.计算机介绍
  3. Linux命令执行过程中的配置文件信息
  4. C++——程序员的逼格神器-github
  5. Arduino esp8266气象时钟当中对象指针的运用
  6. 前端自学之路 Javascript 行话浅析(一)——字面量 包装对象 作用域
  7. 如何通过nginx代理外网访问服务器上的程序
  8. centos 7安装服务器安全狗的傻瓜式教程
  9. 如何在 R 中执行稳健回归
  10. vlookup 2张表 显示na_12个最新Vlookup函数示例大全,再不收藏就是你的错了!