热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一篇关于机器学习中的稀疏矩阵的介绍

教程概述本教程分为5部分;分别为:稀疏矩阵稀疏的问题机器学习中的稀疏矩阵处理稀疏矩阵在Python中稀疏矩阵稀疏矩阵稀疏矩阵是一个几乎由零值组成的矩阵。稀疏矩阵与大多数非零

教程概述

本教程分为5部分;分别为:

  • 稀疏矩阵
  • 稀疏的问题
  • 机器学习中的稀疏矩阵
  • 处理稀疏矩阵
  • 在Python中稀疏矩阵

稀疏矩阵

稀疏矩阵是一个几乎由零值组成的矩阵。稀疏矩阵与大多数非零值的矩阵不同,非零值的矩阵被称为稠密矩阵。

如果矩阵中的许多系数都为零,那么该矩阵就是稀疏的。对稀疏现象有兴趣是因为它的开发可以带来巨大的计算节省,并且在许多大的实践中都会出现矩阵稀疏的问题。

—第1页,《稀疏矩阵的直接教学方法》(Direct Methods for Sparse Matrices),第二版,2017年。

矩阵的稀疏性可以用一个得分来量化,也就是矩阵中零值的个数除以矩阵中元素的总个数。

sparsity = count zero elements / total elements

下面是一个小的3×6稀疏矩阵的例子。

1, 0, 0, 1, 0, 0
A = (0, 0, 2, 0, 0, 1)0, 0, 0, 2, 0, 0

这个例子在矩阵中的18个元素中有13个零值,这个矩阵的得分是0.722或约72%。

稀疏的问题

稀疏矩阵会导致空间复杂度和时间复杂度的问题。

空间复杂度
非常大的矩阵需要大量的内存,而我们想要处理的一些非常大的矩阵是稀疏的。

在实践中,大多数大型矩阵都是稀疏的——几乎所有的项都为零。

—第465页,《线性代数介绍》(Introduction to Linear Algebra),第五版,2016年。

一个非常大的矩阵的例子是,因为它太大而不能存储在内存中,这是一个显示从一个网站到另一个网站的链接的链接矩阵。一个更小的稀疏矩阵的例子可能是一个单词或术语的出现矩阵,在一本书中与所有已知的英语单词对应。

在这两种情况下,所包含的矩阵都是稀疏的,其零值比数据值要多。将这些稀疏矩阵表示为稠密矩阵的问题是对内存的要求,并且必须为矩阵中的每个32位或64位零值做出分配。

这显然是对内存资源的浪费,因为这些零值不包含任何信息。

时间复杂度
假设一个非常大的稀疏矩阵可以适应内存,我们将需要对这个矩阵执行操作。

简单地说,如果矩阵包含了大部分零值,也就是没有数据,那么在这个矩阵中执行操作可能需要很长时间,其中的大部分计算都需要或将零值相加或相乘。

在这样的问题上使用线性代数的一般方法是很浪费的,因为大多数O(N^3)算术运算都用于求解方程组或反转(invert)包含零操作数的矩阵。

—第75页,《数值分析:科学计算的艺术》(Numerical Recipes: The Art of Scientific Computing),第三版,2007年。

这是矩阵运算的时间复杂度增加的问题,随着矩阵的大小而增加。

当我们考虑到即使是琐碎的机器学习方法可能需要对每一行、列甚至整个矩阵进行许多操作时,这个问题也会变得更加复杂,从而导致执行时间大大延长。

机器学习中的稀疏矩阵

稀疏矩阵在应用机器学习中经常出现。

在这一节中,我们将讨论一些常见的例子,以激发你对稀疏问题的认识。

数据
稀疏矩阵在某些特定类型的数据中出现,最值得注意的是记录活动的发生或计数的观察。

三个例子包括:

  • 用户是否在一个电影目录中有曾经看过的电影。
  • 用户是否在一个产品目录中有已经购买过的产品。
  • 在一个歌曲目录中数出收听过的歌曲的数量。

数据准备
在准备数据时,稀疏矩阵会出现在编码方案中。

三种常见的例子包括:

  • 独热编码,用来表示分类数据为稀疏的二进制向量。
  • 计数编码,用于表示文档中词汇的频率。
  • TF-IDF编码,用于表示词汇中标准化的单词频率得分。

领域研究
机器学习中的一些领域必须开发专门的方法来解决稀疏问题,因为输入的数据几乎总是稀疏的。

三个例子包括:

  • 用于处理文本文档的自然语言处理。
  • 推荐系统在一个目录中进行产品使用。
  • 当处理图像时计算机视觉包含许多黑色像素(black pixel)。

如果在语言模型中有100,000个单词,那么特征向量长度为100,000,但是对于一个简短的电子邮件来说,几乎所有的特征都是0。

—第22页,《人工智能:一种现代方法》(Artificial Intelligence: A Modern Approach),第三版,2009年。

处理稀疏矩阵

表示和处理稀疏矩阵的解决方案是使用另一个数据结构来表示稀疏数据。

零值可以被忽略,只有在稀疏矩阵中的数据或非零值需要被存储或执行。

多个数据结构可以用来有效地构造一个稀疏矩阵;下面列出了三个常见的例子。

  • Dictionary of Keys。在将行和列索引映射到值时使用字典。
  • List of Lists。矩阵的每一行存储为一个列表,每个子列表包含列索引和值。
  • Coordinate List。一个元组的列表存储在每个元组中,其中包含行索引、列索引和值。

还有一些更适合执行高效操作的数据结构;下面列出了两个常用的示例。

  • 压缩的稀疏行。稀疏矩阵用三个一维数组表示非零值、行的范围和列索引。
  • 压缩的稀疏列。与压缩的稀疏行方法相同,除了列索引外,在行索引之前被压缩和读取。

被压缩的稀疏行,也称为CSR,通常被用来表示机器学习中的稀疏矩阵,因为它支持的是有效的访问和矩阵乘法。

在Python中稀疏矩阵

SciPy提供了使用多种数据结构创建稀疏矩阵的工具,以及将稠密矩阵转换为稀疏矩阵的工具。

许多在NumPy阵列上运行的线性代数NumPy和SciPy函数可以透明地操作SciPy稀疏数组。此外,使用NumPy数据结构的机器学习库也可以在SciPy稀疏数组上透明地进行操作,例如用于一般机器学习的scikit-learn和用于深度学习的Keras。

存储在NumPy数组中的稠密矩阵可以通过调用csr_matrix()函数将其转换为一个稀疏矩阵。

在下面的例子中,我们将一个3×6的稀疏矩阵定义为一个稠密数组,将它转换为CSR稀疏表示,然后通过调用todense()函数将它转换回一个稠密数组。

# dense to sparse
from numpy import array
from scipy.sparse import csr_matrix
# create dense matrix
A = array([[1, 0, 0, 1, 0, 0], [0, 0, 2, 0, 0, 1], [0, 0, 0, 2, 0, 0]])
print(A)
# convert to sparse matrix (CSR method)
S = csr_matrix(A)
print(S)
# reconstruct dense matrix
B = S.todense()
print(B)

运行该示例首先打印已定义的稠密数组,接着是CSR表示,然后是重新构建的稠密矩阵。

[[1 0 0 1 0 0][0 0 2 0 0 1][0 0 0 2 0 0]](0, 0) 1(0, 3) 1(1, 2) 2(1, 5) 1(2, 3) 2[[1 0 0 1 0 0][0 0 2 0 0 1][0 0 0 2 0 0]]

NumPy并没有提供一个函数来计算矩阵的稀疏性。

不过,我们可以很容易地计算出矩阵的密度,然后从一个矩阵中减去它。NumPy数组中的非零元素可以由count_nonzero()函数给出,数组中元素的总数可以由数组的大小属性给出。因此,数组的稀疏性可以被计算为:

sparsity = 1.0 - count_nonzero(A) / A.size

下面的例子演示了如何计算数组的稀疏性。

# calculate sparsity
from numpy import array
from numpy import count_nonzero
# create dense matrix
A = array([[1, 0, 0, 1, 0, 0], [0, 0, 2, 0, 0, 1], [0, 0, 0, 2, 0, 0]])
print(A)
# calculate sparsity
sparsity = 1.0 - count_nonzero(A) / A.size
print(sparsity)

运行这个例子首先打印出定义的稀疏矩阵,接着是矩阵的稀疏性。

[[1 0 0 1 0 0][0 0 2 0 0 1][0 0 0 2 0 0]]0.7222222222222222

总结

在学习了这篇教程之后,你知道了:

  • 稀疏矩阵几乎包含全部零值,并且与稠密矩阵不同。
  • 你可能会在数据、数据准备和机器学习的子领域中遇到稀疏矩阵。
  • 有许多有效的方法可以存储和使用稀疏矩阵,而SciPy提供了你可以直接使用的实现。

本文由atyun编译,转载请注明出处。


推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
author-avatar
宋文哲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有