机器学习稀疏矩阵简介(附Python代码)

简介: 本文主要介绍了稀疏矩阵的基本知识、它存在的一些问题以及如何在Python中应用它,对于初学者和工程应用者来说是一份不错的入门材料。


对于一个矩阵而言,若数值为的元素远远多于非元素的个数,且非元素分布没有规律时,这样的矩阵被称作稀疏矩阵;与之相反,若非元素数目占据绝大多数时,这样的矩阵被称作稠密矩阵。

稀疏矩阵在工程应用中经常被使用,尤其是在通信编码机器学习中。若编码矩阵或特征表达矩阵是稀疏矩阵时,其计算速度会大大提升。对于机器学习而言,稀疏矩阵应用非常广,比如数据特征表示、自然语言处理等领域。

用稀疏表示和工作在计算上代价很高,需要专门处理稀疏矩阵的表示和操作等,但是这些操作可以大幅提升性能。

在本教程中,读者可以学习稀疏矩阵的基本概念、存在的问题以及如何在Python中使用它。

4de9a7e30f4f9669a9344b66efc2471647082743

稀疏矩阵

稀疏矩阵是由大部分为的矩阵组成的矩阵,这是和稠密矩阵有所区别的主要特点。

如果它的许多元素为,则矩阵是稀疏的。对稀疏性感兴趣的原因是利用好这一特性能够大幅降低计算量,并且在实践中发现很多大型矩阵问题也是稀疏的。

矩阵的稀疏性可以用一个分数来量化,即矩阵中元素的个数除以矩阵中元素的总数。

sparsity = count zero elements / total elements

下面是一个小的3x6的稀疏矩阵例子

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

上面这个矩阵中总共有18个元素,其中有13个元素为0,则该矩阵的稀疏分数为0.72272%左右。

稀疏存在的问题

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

空间复杂度

矩阵需要大量的内存存储,我们希望使用的一些大型矩阵是稀疏的。

实际上,大多数大型矩阵都是稀疏的,几乎所有的条目都是

一个例子是大型矩阵太大以至于不能存储在内存中,这个矩阵就是链接矩阵,它表示的从一个网站到另一个网站的链接。一个较小的稀疏矩阵例子可能是一本书中针对所有已知单词或术语出现矩阵。这两种情况所包含的矩阵都是稀疏的,其值比非数据值多,将这些矩阵表示为稠密矩阵的问题是需要内存,并且在矩阵中必须分配32位或64值。这显然是对内存资源的一种浪费,因为这些值不包含任何信息。

时间复杂度

假设一个非常大型的稀疏矩阵可以存储在内存中,之后将在这个矩阵上执行一些操作。简单来说,若矩阵主要包含的是值,即没有多少数据,那么对这个矩阵执行操作可能需要花费很长时间,其中执行的大部分计算将涉及值相加或相乘。

在这样的问题上使用线性代数的方法是浪费的,因为大多数O(N^3)的算术运算致力于求解方程组或矩阵求逆涉及的零操作数。

矩阵运算的时间复杂度随着矩阵大小增加而增加。对于机器学习而言,即使是最简单的方法也可能需要对每一行、每一列甚至整个矩阵进行许多操作运算,这会导致执行时间会变得很长,上述问题会变得更加复杂。

机器学习中的稀疏矩阵

稀疏矩阵在机器学习应用中经常出现。本节将讨论一些常见的示例,以便读者对其有个直观的了解,并深入的理解稀疏性问题。

数据

稀疏矩阵一般出现在一些特定类型的数据中,比如常见的记录活动发生的次数等。

这里有三个例子:

1.用户是否在电影目录中观看过电影

2.用户是否购买产品目录中的产品

3.歌曲目录中收听歌曲的次数

数据准备

稀疏矩阵出现在用于编写数据的编码方案中。三个常见的例子如下:

1.独热编码,用于将分类数据表示为稀疏二元向量

2.计数编码,用于表示文档词汇表中单词的频率

3.TF-IDF编码,用于表示词汇表中词频逆文档频数

研究领域

机器学习中一些研究领域必须开发专门的方法来直接解决稀疏性问题,这是因为输入数据几乎总是稀疏的。以下是三个例子:

1.处理文本文档的自然语言处理

2.用于处理目录中的产品使用的推荐系统

3.处理包含大量黑色像素图像时的计算机视觉问题

若语言模型中有100000个单词,那么特征向量的长度为100000,但对于简短的电子邮件消息而言,几乎所有的特征计数为

使用稀疏矩阵

表示和使用稀疏矩阵的解决方案是使用替代的数据结构来表示稀疏矩阵。零元素值可以被忽略,只有稀疏矩阵中的非零元素值需要被存储或使用。有多种数据结构能有效地构造稀疏矩阵,下面列出三个常见示例:

1.字典:一个字典使用行和列索引映射出一个值

2.列表的列表:矩阵的每一行都以列表形式存储,每个子列表包含列的索引和其值

3.坐标列表:元组列表存储在包含行索引、列索引和其值的每个元组中

还有一些更适合执行有效操作的数据结构,比如以下两个常见示例:

1.CSR(Compressed Sparse Row):稀疏矩阵用非零值的三个一维数组、行的范围和列索引表示

2.CSC(Compressed Sparse Column):与CSR方法相同,只是列索引在行索引之前被压缩并首先被读取

Python中的稀疏矩阵

SciPy使用多个数据结构为创建稀疏矩阵提供了工具,以及将稠密矩阵转化为稀疏矩阵的工具。许多在Numpy数组上运行的线性代数Numpy和SciPy函数可以在SciPy稀疏数组上操作。此外,使用Numpy数据结构的机器学习库也可以在Scipy稀疏数组上操作,例如,用于机器学习的scikit-learning和用于深度学习的Keras。

通过调用scr_matrix()函数,可以使用CSR表示将存储在Numpy数组中的稠密矩阵转换为稀疏矩阵。在下面的例子中,定义一个3x6稀疏矩阵作为一个密集数组,并将其转换为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()函数给出,数组中的元素总个数可以由数组的size属性给出。因此,可以将数组稀疏度计算为:

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


相关资源

如果您希望深入的了解稀疏矩阵,本节提供了有关该主题的一些资源:

书籍

线性代数简介,第五版,2016.

科学计算的艺术,第三版,2007.

人工智能:现代方法,第三版,2009.

直接稀疏矩阵的方法,第二版,2017.

API

Sparse matrices(scipy.sparse)API

Scipy.sparse.csr_matrix()API

Numpy.count_nonzero()API

Numpy.ndarray.size API

文章

稀疏矩阵(维基百科)

 

数十款阿里云产品限时折扣中,赶紧点击领劵开始云上实践吧!

作者信息

Jason Brownlee机器学习专家,专注于机器学习的推广教育

Linkedin: http://www.linkedin.com/in/jasonbrownlee/

本文由阿里云云栖社区组织翻译文章原标题《A Gentle Introduction to Sparse Matrices for Machine Learning》,作者:Jason Brownlee,译者:海棠。

文章为简译,更为详细的内容,请查看原文

 

 

 

相关文章
|
机器学习/深度学习 算法 Python
机器学习特征筛选:向后淘汰法原理与Python实现
向后淘汰法(Backward Elimination)是机器学习中一种重要的特征选择技术,通过系统性地移除对模型贡献较小的特征,以提高模型性能和可解释性。该方法从完整特征集出发,逐步剔除不重要的特征,最终保留最具影响力的变量子集。其优势包括提升模型简洁性和性能,减少过拟合,降低计算复杂度。然而,该方法在高维特征空间中计算成本较高,且可能陷入局部最优解。适用于线性回归、逻辑回归等统计学习模型。
531 7
|
机器学习/深度学习 人工智能 算法
PaperCoder:一种利用大型语言模型自动生成机器学习论文代码的框架
PaperCoder是一种基于多智能体LLM框架的工具,可自动将机器学习研究论文转化为代码库。它通过规划、分析和生成三个阶段,系统性地实现从论文到代码的转化,解决当前研究中代码缺失导致的可复现性问题。实验表明,PaperCoder在自动生成高质量代码方面显著优于基线方法,并获得专家高度认可。这一工具降低了验证研究成果的门槛,推动科研透明与高效。
970 19
PaperCoder:一种利用大型语言模型自动生成机器学习论文代码的框架
|
12月前
|
机器学习/深度学习 人工智能 算法
Scikit-learn:Python机器学习的瑞士军刀
想要快速入门机器学习但被复杂算法吓退?本文详解Scikit-learn如何让您无需深厚数学背景也能构建强大AI模型。从数据预处理到模型评估,从垃圾邮件过滤到信用风险评估,通过实用案例和直观图表,带您掌握这把Python机器学习的'瑞士军刀'。无论您是AI新手还是经验丰富的数据科学家,都能从中获取将理论转化为实际应用的关键技巧。了解Scikit-learn与大语言模型的最新集成方式,抢先掌握机器学习的未来发展方向!
1325 12
Scikit-learn:Python机器学习的瑞士军刀
|
10月前
|
人工智能 Python
python基本数据类型简介
本文简要介绍了Python的基本数据类型,包括整型、浮点型、字符串、列表、字典和布尔类型,帮助读者对Python数据类型有初步了解。
267 0
|
机器学习/深度学习 人工智能 开发者
DeepSeek安装部署指南,基于阿里云PAI零代码,小白也能轻松搞定!
阿里云PAI平台支持零代码一键部署DeepSeek-V3和DeepSeek-R1大模型,用户可轻松实现从训练到部署再到推理的全流程。通过PAI Model Gallery,开发者只需简单几步即可完成模型部署,享受高效便捷的AI开发体验。具体步骤包括:开通PAI服务、进入控制台选择模型、一键部署并获取调用信息。整个过程简单快捷,极大降低了使用门槛。
2287 43
|
机器学习/深度学习 数据可视化 算法
Python与机器学习:使用Scikit-learn进行数据建模
本文介绍如何使用Python和Scikit-learn进行机器学习数据建模。首先,通过鸢尾花数据集演示数据准备、可视化和预处理步骤。接着,构建并评估K近邻(KNN)模型,展示超参数调优方法。最后,比较KNN、随机森林和支持向量机(SVM)等模型的性能,帮助读者掌握基础的机器学习建模技巧,并展望未来结合深度学习框架的发展方向。
Python与机器学习:使用Scikit-learn进行数据建模
|
机器学习/深度学习 数据可视化 TensorFlow
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。
|
人工智能 JSON 自然语言处理
如何用大模型评估大模型——PAI-Judge裁判员大语言模型的实现简介
阿里云人工智能平台 PAI 推出 PAI-Judge 裁判员大模型,为用户构建符合应用场景的多维度、细粒度的评测体系,支持单模型评测和双模型竞技两种模式,允许用户自定义参数,实现准确、灵活、高效的模型自动化评测,为模型迭代优化提供数据支撑。 相比通用大模型尤其在回答确定性/数学类问题、角色扮演、创意文体写作、翻译等场景下,PAI-Judge 系列模型表现优异,可以直接用于大模型的评估与质检。
|
机器学习/深度学习 数据可视化 算法
Python 高级编程与实战:深入理解数据科学与机器学习
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化和调试技巧。本文将深入探讨 Python 在数据科学和机器学习中的应用,并通过实战项目帮助你掌握这些技术。
|
数据采集 运维 Java
课时13:Python简介
今天我们分享的是 Python 的简单介绍,主要分为以下四部分。 1. Python 的百科介绍 2. Python 的发明者 3. Python 的发展历史 4. Python 的用途
339 1

推荐镜像

更多