https://www.toutiao.com/a6647043426384609805/

2019-01-16 18:43:19

什么是稀疏矩阵?

我们知道矩阵是一个由m行和n列组成的二维数据对象,因此一共有m x n个数值。当这个矩阵的绝大部分数值为零,且非零元素呈不规律分布时,则称该矩阵为稀疏矩阵(Sparse Matrix)。下图所示的是一个8 x 8的稀疏矩阵。

稀疏矩阵在机器学习方面是很常见的。尽管它们自然而然地出现在一些数据收集过程中,更多时候,它们是在使用特定的数据转化技术时得到的。例如我们用一个算法来提取词性标签作为补充标签,来训练序列分类器;如果在文档全集中进行提取,其结果可以被向量化成一个非常巨大的稀疏矩阵,从而作为参数传递给分类器;又例如从TalkingData的移动数据中,把移动设备的品牌以及使用的app这两个变量变为虚拟变量时,我们会得到一个数万列的稀疏矩阵。

说了这么多稀疏矩阵,我们不禁会问,是不是也存在稠密矩阵?答案是显而易见的,那些非零数值占大多数元素的矩阵即是稠密矩阵(Dense Matrix)。那么两者之间除了直观上的不同,还有其他深层次的区别吗?或者说,相对于稠密矩阵,稀疏矩阵有哪些优点?

为什么使用稀疏矩阵?

由于稀疏矩阵含有许多数值为零的元素,我们可以运用特定算法做以下两件重要的事:

1. 压缩矩阵对象的内存台面空间

2. 加速多数机器学习程序

存储稀疏矩阵必须为矩阵中的每个32位乃至64位零值分配存储器,这明显是浪费内存资源的,因为这些零值不包含任何信息。我们可以利用压缩技术使我们需要存储的数据量最小化。这并非唯一好处。几乎所有的自然机器学习算法都要求数据矩阵事先存在于内存中,也就是说,当数据矩阵不能完全存入内存中时,机器学习过程就会中断。将稠密矩阵转换成稀疏矩阵的好处之一就是在多数情况下,稀疏矩阵可以被压缩到能适应内存容量。

再者,考虑一个稀疏矩阵和一个稠密矩阵相乘。尽管稀疏矩阵中有很多零值,我们也知道零乘以任何数还是零,然而常规途径会不可避免地进行此无意义的运算。这就大大拖延了处理时间。显然,只操作那些返回非零数值的元素是更加有效率的。因此,任何用到基本数学运算(比如乘法)的算法都能从稀疏矩阵实施中获益。

我们可以通过下面这个简单的例子验证以上结论。假设我们有一个2000×10000的数据集,该矩阵的元素只有1和0两个数值。为了直观表现出这个矩阵的稀疏度,我们建立一个象限,用点来表示数值为1的元素,数值为0的元素则留白,如下图所示。

可以看到,图像化的数据集大部分都是空白的。作为比较,下图所示的是一个元素数量相同的稠密矩阵。

现在我们尝试将稠密矩阵转换成稀疏矩阵。这里,我们通过Python SciPy模块中的压缩稀疏行(CSR)算法来完成这一操作。压缩结果如下图所示。可以看到,稠密矩阵的大小是160 MB,而稀疏矩阵的大小则是24 MB,这相当于85%的压缩率!

接着让我们来看一下计算时间方面的比较。我们运行三种不同的分类算法:伯努利朴素贝叶斯(Bernoulli Naive Bayes)、逻辑回归(Logistic Regression)、以及支持向量机(Support Vector Machines),然后分别检查各个算法的处理时间。

试验结果总结如下:

可以看出,朴素贝叶斯分类器在稀疏矩阵下运行速度提升了8倍;对于逻辑回归,我们看到处理时间减少了大约33%,尽管性能不如朴素贝叶斯,提速还是很明显的;最后来看支持向量机,相对于稠密矩阵,稀疏矩阵仅仅用了一半的处理时间!总的来说,将稠密矩阵转换为稀疏矩阵形式几乎总是可以提升处理时间上的效率。

稀疏矩阵稀疏性处理

通常,为了处理稀疏性矩阵,我们会构造更为有效的数据结构,压缩稀疏行和列,或者通过PCA、SVD等方法来进行降维。

1构造更为有效的数据结构

因为零值没有太多的意义,所以我们可以忽略零值,并且仅需要存储或操作稀疏矩阵中数据或非零值。有多种数据结构可用于有效地构造稀疏矩阵,下面列出了三个常见的例子。

● Dictionary of Keys:使用字典,其中行和列索引映射到值。

● List of Lists:矩阵的每一行都存储为一个列表,每个子列表包含列索引和值。

● Coordinate List :每个元组都存储一个元组列表,其中包含行索引、列索引和值。

2压缩稀疏行或者列

可以通过对数据的理解来合并或者删除部分列。例如上文提到app数据,我们可以将app根据其所属的类型分为金融、娱乐、音乐或者电影等,之后将其进行合并,即可大大提高运算效率。而对于一些使用频率远低于平均值的列可以酌情删掉。

3降维

除了传统的PCA、k-SVD、LDA、NNMF等方法外,今天分享一个PCA方法的延展:构筑-核心集算法。

将维基百科的文本作为案例,一个369万(份文件)×796万(个英文词汇)的稀疏矩阵,其空间复杂度可想而知。目前还没有一种降维算法能够计算这个矩阵的特征值。基于这点,即便是用最先进的GenSim库来对维基的“文件-词汇”稀疏矩阵运行SVD算法,计算机也会很快地在最初的几千份文件的随机投影过程中宕机。这里介绍一种新的构筑-核心集算法,从而有效的解决上述问题。

● (k,ε)-核心集((k,ε)-Coreset):

基础概念:

对于一个n维空间的点集

和一个n维空间内的向量

,我们定义向量

到点集S中的最小欧式距离为:

对于一个(m×n)维的矩阵A,其行向量是

,我们定义A到S的距离平方和为:

对于核心集:

所谓核心集,指的是对于一个(m×n)的矩阵A,其行向量

可以理解为m个在n维空间的点。而核心集是由这些行向量

加权之后的集合C,即

(这里的所有权重均大于等于0)。这时我们说,核心集C是矩阵A的行向量集合的一个加权子集。但所有权重均等于1时,这是集合C就是A的行向量的集合。此外,核心集还需满足,对于所有的k阶子空间S,其到A的距离可以近似的表示成其到A的核心集C的距离。用数学表达式表示则是:

简单地说,就是S到A的距离可以用S到C的距离近似表示。

可以这样理解,当绝大多数的权重都等于0的时候,原先的440万份文件,就可以用最后的几千份文件乘以各自权重代表,并且保持足够程度的信息量,这时的数据量就从原先的369万(份文件)×796万(个英文单词)降低到几千(份文件)×796万(英文单词)的程度。

从这个角度来讲核心集并未对矩阵A中的维度进行处理,而仅仅是对行数进行了压缩。因此,将构建核心集结合已有的PCA、SVD或者LSA降维,可以将原有的稀疏矩阵压缩至一个新的(p×q)的矩阵

(这里,p≪m,q≪n)。

至此,关于稀疏矩阵的降维处理,我们可以应用SVD-Coreset,或者PCA-Coreset方法进行多步降维。

● 核心集算例:

在抽样的过程中,利用核心集算法和利用均匀随机抽样,以及加权随机抽样所构筑的样本集合,对于不同的迭代次数k,在利用(3)式计算出来的相对误差对比图,显示在下图(a)-(c)中。

可以看到利用核心集构造的方法抽样,其相对误差对比另外两种方法总体上更为稳定。换言之,通过构造核心集的方法进行抽样,其样本在代表全体的表现上更有优势,尤其是当样本数量超过一定阈值的时候。

图(e)显示的是,应用不同的降维方法在整个(369万×796万)维基百科的数据上进行LSA分析的实验。红色的线是利用MATLAB的svds工具箱在16GB内存笔记本电脑上运行的结果,蓝色的线是利用MATLAB的svds工具箱在集群上运行的结果,绿色的线是利用核心集-SVD方法在集群上运行的结果。

可以看到,随着维度的增加,每个方法的运行时间都在增加,但是最先崩溃的是用笔记本运行MATLAB的svds方法的LSA分析,原因是内存溢出。在分别利用MATLAB的svds和核心集-SVD的方法比较中,无论是运行时间,还是空间复杂度上,核心集-SVD方法相比较之下具有优势,并且优势明显,且表现稳定。

因此,在大规模稀疏矩阵的降维处理过程中,核心集配合其他的降维方法(包括PCA、SVD等),可以有效的提高模型对数据降维处理的性能。

干货|机器学习-稀疏矩阵的处理相关推荐

  1. 干货|机器学习零基础?不要怕,吴恩达课程笔记第三周!逻辑回归与正则

    吴恩达Coursera机器学习课系列笔记 课程笔记|吴恩达Coursera机器学习 Week1 笔记-机器学习基础 干货|机器学习零基础?不要怕,吴恩达机器学习课程笔记2-多元线性回归 1 Logis ...

  2. 干货 | 机器学习算法在饿了么供需平衡系统中的应用

    干货 | 机器学习算法在饿了么供需平衡系统中的应用 image:url(https://ask.qcloudimg.com/avatar/1292807/6341kxs4h2.png?imageVie ...

  3. 干货 | 机器学习正在面临哪些主要挑战?

    点击上方"AI有道",选择"星标公众号" 重磅干货,第一时间送达! 在上一篇文章: 机器学习实用指南:这些基础盲点请务必注意! 红色石头给大家介绍了<Sc ...

  4. 干货 | 机器学习入门方法和资料合集

    作者 何从庆 授权自 AI算法之心 近些天在微信群里经常看小伙伴问到"机器学习如何入门,看哪些资料 ?",于是乎想根据笔者学习两年多的学习经验,介绍下机器学习如何入门,该看哪些资料 ...

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

    对于一个矩阵而言,若数值为零的元素远远多于非零元素的个数,且非零元素分布没有规律时,这样的矩阵被称作稀疏矩阵:与之相反,若非零元素数目占据绝大多数时,这样的矩阵被称作稠密矩阵. 稀疏矩阵在工程应用中经 ...

  6. 干货︱机器学习中防止过拟合的处理方法

    我们都知道,在进行数据挖掘或者机器学习模型建立的时候,因为在统计学习中,假设数据满足独立同分布(i.i.d,independently and identically distributed),即当前 ...

  7. 干货|机器学习零基础?不要怕,吴恩达机器学习课程笔记2-多元线性回归

    吴恩达Coursera机器学习课系列笔记 课程笔记|吴恩达Coursera机器学习 Week1 笔记-机器学习基础 1 Linear Regression with Multiple Variable ...

  8. 对pca降维后的手写体数字图片数据分类_知识干货-机器学习-TSNE数据降维

    1.TSNE的基本概念 2.例1 鸢尾花数据集降维 3.例2 MINISET数据集降维 1.TSNE的基本概念 t-SNE(t-distributed stochastic neighbor embe ...

  9. 量化干货 | 机器学习能否助力风险投资?

    作者:石川,量信投资创始合伙人,清华大学学士.硕士,麻省理工学院博士:精通各种概率模型和统计方法,擅长不确定性随机系统的建模及优化.转载自公众号"川总写量化" 1.引言 近几年,以 ...

最新文章

  1. Android10.0 Binder通信原理(五)-Binder驱动分析
  2. 一个好玩的 屏蔽别人审查元素F12 右键及其他复制粘贴等
  3. max函数的平滑(log-sum-exp trick)
  4. java 注解_怎样理解 Java 注解和运用注解编程?
  5. 过滤html标签 RemoveHTML
  6. 学习Java的十大理由,益处太多了
  7. PHP实现文件安全下载
  8. unix-privesc-check提权漏洞快速检测工具
  9. python数据预测案例_Python数据分析及可视化实例之疾病预测(分类)
  10. Rust : time,关于程序运行的计时
  11. 自制Flash电子相册
  12. Java二叉树的完全性检验
  13. 海康 Isecure VMS 客户端二次开发简单记录
  14. android 有线网络,安卓手机免费“有线”上网
  15. 快速集成百度定位功能
  16. Nginx反向代理及域名解析访问本地项目
  17. h5跳转微信小程序,短信外链外部跳转微信打开任意第三方网址url,抖音跳转微信添加好友直接方法?
  18. reacr富文本编辑器
  19. UESTC 2018 Summer Training #4 Div.2
  20. Ray----Tune(5):Tune包中的类和函数参考

热门文章

  1. 《动手学深度学习》环境搭建全程详细教程 window用户
  2. 从B树、B+树、B*树谈到R 树
  3. JavaScript经典pdf书籍推荐
  4. 动漫设计与制作计算机专业,计算机动漫设计与制作专业(毕业论文).doc
  5. git-cz git commit 定制提交规范
  6. mac 终端查看端口命令
  7. MFC的使用——在共享DLL中使用MFC、在静态库中使用MFC
  8. 电机编码器的使用方法
  9. 拉里 埃里森_拉里·埃里森(Larry Ellison)的宝座
  10. iOS 高德地图(五)绘制点标记