非负矩阵分解(Non-Negative Matrix Factorization)
这个问题是我在进行文本的主题提取时遇到的。处理的矩阵是文本数据的tf-idf矩阵。如果你使用的词向量,也可以是词向量经过组合之后得到的矩阵。我们的目标是要对这个矩阵进行因式分解,即找到两个更小的矩阵,使得二者相乘以得到原来的矩阵。
该矩阵分解的特殊之处就在于,它要求两个小矩阵中的元素都是非负的。这个要求在特定的问题中是有其特殊含义的。例如说,在文本的主题提取时,使用的是tf-idf矩阵,每一项都不可能是负值。得到的两个小矩阵,特征矩阵和权重矩阵,其值也都不可能是负数。这也意味着特征是不能做减法的,即从某些特征中去掉一部分其他的特征。如果明确排除掉某些单词,则NMF将无法找到有效解。尽管这样的约束也许会阻碍算法得到最佳的因式分解,但其结果却往往更易于理解。
该方法在语音分析、图像处理等其他领域中也有着重要的应用。
整个问题的目标函数为:
其中A为原始矩阵,其规模为 m×n ;W为权重矩阵,规模为 m×k ;H为特征矩阵,规模为 k×n 。目的是使得重构误差尽量小。这里我只讲下算法大概的含义,具体如何求解这个问题就不再做说明了。
特征矩阵
在该矩阵中,每个特征对应这一行,每个单词对应一列。这里的特征并不是实际意义上文本矩阵的特征,而是人为地赋予特征的含义。矩阵中的数字代表了某个单词相对于某个特征的重要程度。每个特征对应于在一组文章中出现的某个主题。
k表示特征的个数,在实际的算法中这个值是可以人为指定的。如果特征数与文章数恰好相等,那么最理想的结果是能够为每一篇文章都找到一个阈值完美匹配的特征。不过,在此处使用矩阵因式分解的目的是为了缩减观测数据的集合规模,并保证缩减之后足以反应某些共性特征。理想情况下,这个相对较小的特征集能够与不同的权重值相结合,从而尽量完美地重新构造出原始的数据集。在我做主题抽取时,将这个值取1。那么特征矩阵就表示每一个词对于这组文本的重要性。
权重矩阵
该矩阵的作用是将特征映射到文章矩阵。其中每一行对应与一篇文章,每一列对应于一个特征。矩阵中的数字代表了将每一个特征应用于每篇文章的程度。
只要将权重矩阵与特征矩阵相乘,就可以重构出文章矩阵。
写在最后
本篇博客部分内容取自《集体智慧编程》。