稀疏矩阵的概念介绍

在机器学习中,如果我们的样本数量很大,在大多数情况下,首选解决方案是减少样本量、更改算法,或者通过添加更多内存来升级机器。这些方案不仅粗暴,而且可能并不总是可行的。由于大多数机器学习算法都期望数据集(例如常用的 DataFrame)是保存在内存中的对象(因为内存读取要比磁盘读取快不止一个量级),所以升级硬件这种解决方案基本上会被否定。所以科学家们找到的一种既能够保存信息,又节省内存的方案:我们称之为“稀疏矩阵”。

背景

Pandas的DataFrame 已经算作机器学习中处理数据的标配了 ,那么稀疏矩阵的真正需求是什么?答案是空间复杂度和时间复杂度。当涉及数百万行和/或数百列时,pandas DataFrames 变得最糟糕,这时因为 pandas DataFrams 存储数据的方式。例如下面的图,这是 CSV 文件的磁盘和内存大小比较。我们在这里使用的数据集是 Santander Customer Satisfaction 数据集。 途中比较了 CSV 文件在读取为 DataFrame 之前和读取为 DataFrame 之后的磁盘/内存使用情况。

  1. import os
  2. import pandas as pd
  3. #Read csv file
  4. data = pd.read_csv("train.csv")
  5. memory_usage = data.to_numpy().nbytes/1e6
  6. #Read the original file size using os module
  7. disk_usage = os.path.getsize('/content/train.csv')/1e6
  8. #Lets plot results
  9. plt.figure(figsize=(10,8))
  10. plt.bar(x=["CSV","DataFrame"],height=[disk_size,memory_usage])
  11. plt.title("Size comparison - CSV vs DataFrame")
  12. plt.ylabel("Usage (MB)")
  13. plt.show()

可以明显地看到数据大小的差异,可能是因为里面包含了很多0或者空值导致的,本文后面我们会有详细的分析和介绍

什么是稀疏矩阵?

有两种常见的矩阵类型,密集和稀疏。主要区别在于稀疏指标有很多零值。密集的指标没有。这是一个具有 4 列和 4 行的稀疏矩阵的示例。

在上面的矩阵中,16 个中有 12 个是零。这就引出了一个简单的问题:

我们可以在常规的机器学习任务中只存储非零值来压缩矩阵的大小吗?

简单的答案是:是的,可以!

我们可以轻松地将高维稀疏矩阵转换为压缩稀疏行矩阵(简称 CSR 矩阵)。对于这种压缩我们的要求是压缩后的矩阵可以应用矩阵运算并以有效的方式访问指标,所以CSR并不是唯一方法,还有有更多的选项来存储稀疏矩阵。例如:Dictionary of keys (DOK)、List of Lists (LIL)、Coordinate list (COO)、Compressed row storage (CRS)等。

但是稀疏矩阵的一个主要缺点是访问单个元素变得更加复杂。下面可以为选择不同的方法提供一些参考:

  • 如果关心的是高效修改 - 使用 DOK、LIL 或 COO。这些通常用于构建矩阵。
  • 如果关心的是有效的访问和矩阵操作 - 使用 CSR 或 CSC

上面说到了很多名词为简单起见我们深入研究一个CSR的示例。考虑下面的矩阵。

将上述矩阵转换为 CSR 矩阵的情况。在这里使用的是 scipy包的sparsemodule。

完整文章:

https://www.overfit.cn/post/b47f933731bc43c28733c93dd991af72

posted @   deephub  阅读(360)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2020-03-21 更快的计算,更高的内存效率:PyTorch混合精度模型AMP介绍
点击右上角即可分享
微信分享提示