2007年1月1日下午03:10:00 发表者:Google研究员,吴军
我在大学学习线性代数时,实在想不出它除了告诉我们如何解线性方程外,还能有什么别的用途。关于矩阵的许多概念,比 如特征值等等,更是脱离日常生活。后来在数值分析中又学了很多矩阵的近似算法,还是看不到可以应用的地方。当时选这些课,完全是为了混学分的学位。我想, 很多同学都多多少少有过类似的经历。直到后来长期做自然语言处理的研究,我才发现数学家们提出那些矩阵的概念和算法,是有实际应用的意义的。
在自然语言处理中,最常见的两类的分类问题分别是,将文本按主题归类(比如将所有介绍亚运会的新闻归到体育类)和将 词汇表中的字词按意思归类(比如将各种体育运动的名称个归成一类)。这两种分类问题都可用通过矩阵运算来圆满地、同时解决。为了说明如何用矩阵这个工具类 解决这两个问题的,让我们先来来回顾一下我们在余弦定理和新闻分类中介绍的方法。
分类的关键是计算相关性。我们首先对两个文本计算出它们的内容词,或者说实词的向量,然后求这两个向量的夹角。当这 两个向量夹角为零时,新闻就相关;当它们垂直或者说正交时,新闻则无关。当然,夹角的余弦等同于向量的内积。从理论上讲,这种算法非常好。但是计算时间特 别长。通常,我们要处理的文章的数量都很大,至少在百万篇以上,二次回标有非常长,比如说有五十万个词(包括人名地名产品名称等等)。如果想通过对一百万 篇文章两篇两篇地成对比较,来找出所有共同主题的文章,就要比较五千亿对文章。现在的计算机一秒钟最多可以比较一千对文章,完成这一百万篇文章相关性比较 就需要十五年时间。注意,要真正完成文章的分类还要反复重复上述计算。
在文本分类中,另一种办法是利用矩阵运算中的奇异值分解 (SingularValueDecomposition,简称SVD)。现在让我们来看看奇异值分解是怎么回事。首先,我们可以用一个大矩阵A来 描述这一百万篇文章和五十万词的关联性。这个矩阵中,每一行对应一篇文章,每一列对应一个词。
在上面的图中,M=1,000,000,N=500,000。第i行,第j列的元素,是字典中第j个词在第i篇文章中出现的加权词频(比如,TF/IDF)。读者可能已经注意到了,这个矩阵非常大,有一百万乘以五十万,即五千亿个元素。
奇异值分解就是把上面这样一个大矩阵,分解成三个小矩阵相乘,如下图所示。比如把上面的例子中的矩阵分解成一个一百 万乘以一百的矩阵X,一个一百乘以一百的矩阵B,和一个一百乘以五十万的矩阵Y。这三个矩阵的元素总数加起来也不过1.5亿,仅仅是原来的三千分之一。相 应的存储量和计算量都会小三个数量级以上。
三个矩阵有非常清楚的物理含义。第一个矩阵X中的每一行表示意思相关的一类词,其中的每个非零元素表示这类词中每个 词的重要性(或者说相关性),数值越大越相关。最后一个矩阵Y中的每一列表示同一主题一类文章,其中每个元素表示这类文章中每篇文章的相关性。中间的矩阵 则表示类词和文章雷之间的相关性。因此,我们只要对关联矩阵A进行一次奇异值分解,w我们就可以同时完成了近义词分类和文章的分类。(同时得到每类文章 和每类词的相关性)。
现在剩下的唯一问题,就是如何用计算机进行奇异值分解。这时,线性代数中的许多概念,比如矩阵的特征值等等,以及数 值分析的各种算法就统统用上了。在很长时间内,奇异值分解都无法并行处理。(虽然Google早就有了MapReduce等并行计算的工具,但是由 于奇异值分解很难拆成不相关子运算,即使在Google内部以前也无法利用并行计算的优势来分解矩阵。)最近,Google中国的张智威博士和几个 中国的工程师及实习生已经实现了奇异值分解的并行算法,我认为这是Google中国对世界的一个贡献。
分享到:
相关推荐
矩阵运算在C#中处理起来可能较为复杂,因为这需要对线性代数有深入理解,并且手动编写大量的数学函数。这个插件则简化了这一过程,它提供了现成的API和类库,帮助开发者快速进行矩阵的加法、减法、乘法、转置、求逆...
这个工具集成了多种矩阵操作,包括基础的矩阵运算和高级的数学运算,旨在提高对矩阵计算的便利性和效率。下面将详细探讨涉及的知识点。 1. **C++基础知识**:C++是一种通用的、面向对象的编程语言,它扩展了C语言的...
在MATLAB中,矩阵运算是其核心功能之一,对于数学建模来说,它是一个不可或缺的工具。MATLAB(Matrix Laboratory)的设计初衷就是处理矩阵和数组,因此它的语法和功能都高度适应矩阵运算的需求。本资料“数学建模-...
在本项目“C语言课程设计之矩阵运算”中,我们将探讨如何使用C语言进行矩阵的各种基本运算,包括矩阵的加法、减法、乘法以及转置。这是一份经过精心设计并获得高分评价的课程设计,其代码结构清晰,易于理解,非常...
综上所述,将数学建模思想和Matlab软件融入到矩阵运算的教学中,不仅可以帮助学生更好地理解和应用矩阵知识,还能够让学生学会如何将数学方法应用于解决现实问题,提高学生的实践能力和创新思维。同时,掌握Matlab...
"mini数学矩阵运算库 C语言"是专为处理这类问题而设计的一个小型库,它允许开发者用C语言进行高效且便捷的矩阵运算。 C语言是一种底层编程语言,因其高效性和对硬件的直接控制而广泛用于系统编程和高性能计算。在这...
矩阵转置是将矩阵的行变成列,列变成行的过程,这个功能在很多数学问题中非常有用。这些运算的核心算法需要精确且高效地实现,以确保计算的正确性和速度。 四、稀疏矩阵 稀疏矩阵是指大部分元素为零的矩阵。在实际...
本资料“数学建模及Matlab软件在矩阵运算教学中的应用”深入探讨了如何利用Matlab来提高矩阵运算的教学效果和实践能力。 一、数学建模基础 数学建模是将实际问题抽象为数学模型的过程,通过数学语言描述问题的本质...
在实际编程过程中,应特别注意错误处理,例如矩阵维度不匹配、矩阵不可逆等情况,都需要有适当的提示和处理机制。同时,为了提高效率,可以考虑优化算法,如使用矩阵分块运算、缓存策略等。 通过这个Delphi矩阵运算...
在AI和深度学习领域,矩阵运算是至关重要的...通过这些矩阵运算,我们可以解决许多AI和深度学习中的问题,如神经网络的权重更新、图像处理、自然语言处理等。了解并熟练掌握这些知识点对于理解和实现高级算法至关重要。
3. **乘法**:稀疏矩阵乘法较为复杂,需要考虑每对元素 (i, j) 的和为两矩阵中所有满足 i=k+l 的 (k, l) 位置元素的乘积之和。这需要通过行扫描和列扫描策略来高效实现,例如使用“自底向上”或“自顶向下”的动态...
在教学实践中,教师可以设计一系列基于Matlab的矩阵运算实验,引导学生逐步掌握矩阵运算的原理和技巧。这些实验可以包括基础的矩阵乘法、逆矩阵求解线性方程组,再到更高级的应用,如特征值分析、奇异值分解等。通过...
矩阵运算是数学和计算机科学中的一种基本操作,它在很多领域都有应用,如线性代数、机器学习、计算机视觉等。C# 作为 một种强大的编程语言,也提供了丰富的矩阵运算功能。下面我们将详细介绍 C# 中的矩阵运算。 一...
在本文中,我们将深入探讨如何利用Microsoft Foundation Classes (MFC) 框架来实现一个简单...在实际应用中,这样的程序可能需要进一步扩展,比如支持矩阵转置、求解线性方程组等功能,以满足更广泛的数学和工程需求。
Engin3专注于矩阵和向量操作,为开发者提供了简洁而强大的API,使得在C++中处理线性代数问题变得更加便捷。 Engin3的核心是Eigen3库,一个开源的C++模板库,专为数值计算而设计。Eigen3支持各种矩阵和向量操作,...
在IT领域,矩阵运算库是计算机科学中一个重要的组成部分,特别是在数值计算、机器学习和图形处理等应用中。本文将详细介绍三个开源的矩阵运算库——Armadillo、MTL(Matrix Template Library)以及Alglib,并探讨...
矩阵运算讲义是一本关于矩阵运算技巧的详细入门级工具书,它提供了矩阵和矩阵相关问题的一个便捷的桌面参考。此书的内容涵盖了从基础到高级的各种矩阵运算,包括矩阵的导数、逆矩阵、特征值、迹、向量范数、矩阵范数...
总的来说,这个"超全的关于矩阵运算的程序"对于需要处理大量数学计算的开发者来说是一个宝贵的资源,它简化了矩阵运算的实现,提高了开发效率,同时也为初学者提供了学习矩阵运算和C语言编程的实例。
本PPT学习教案全面细致地讲解了矩阵运算的基本概念与运算规则,并通过实例演示了矩阵运算在不同学科中的应用,旨在帮助学习者深入理解矩阵运算的原理,并能够将所学知识应用于解决实际问题。 首先,教案明确指出...
总之,“矩阵运算库”对于处理复杂的数学问题和数据分析任务至关重要,而MTL作为这样一个库,为开发人员提供了强大的工具,使得在Linux环境中进行矩阵运算变得更加便捷和高效。通过理解和熟练使用这样的库,开发者...