浅入浅出:PageRank算法 使用 TextRank 算法为文本生成关键字和摘要 基于物品的协同过滤 如何使用MapReduce实现基于物品的协同过滤(1) 如何使用MapReduce实现基于物品的协同过滤(2) 浅入浅出:K近邻算法 使用mahout下的朴素贝叶斯分类器对新闻分类 使用Affinity Propagation进行聚类 K-medoids聚类 矩阵分解在推荐系统中的应用:NMF和经典SVD实战 使用特征递归消除筛选特征 如何分配权重 比较NMF、PCA和VQ 方差和协方差 基于SVD的协同过滤 逻辑斯谛回归代码实现 隐语义模型和NMF(非负矩阵分解) 使用PCA处理MNIST数据集 使用GBDT选取特征 基于贝叶斯的文本分类系统的数据库设计 在hadoop1.2.1上安装mahout 0.9 Hadoop 2.4 实现Kmeans聚类算法 在Iris数据集上对比PCA、LDA、NMF 基于贝叶斯的文本分类实战 单层决策树 Logistic regression(逻辑斯蒂回归) 基于用户的协同过滤 词袋模型与文档-词矩阵 如何实现拼音与汉字的互相转换 梯度下降法 如何判定相似度 MovieLens数据集介绍 基于KNN的文本分类实战 Jasper文本分类系列博客阅读摘录 使用 Mean Shift进行聚类 朴素贝叶斯的三个常用模型:高斯、多项式、伯努利 使用决策树处理iris数据集 浅入浅出:从Kmeans到Kmeans++ 如何持久化scikit-learn中训练好的模型 浅入浅出:DBSCAN聚类算法(1) 浅入浅出:DBSCAN聚类算法(2) 2015阿里移动推荐算法比赛第一赛季总结 爬山算法 使用朴素贝叶斯分类器划分邮件 层次聚类 基于MapReduce的频繁项集挖掘 搜狗实体关系提取比赛

隐语义模型和NMF(非负矩阵分解)


#机器学习


2014-12-22

本文介绍了隐语义模型和NMF(非负矩阵分解)。

隐语义模型

我当前是在推荐系统和文本分类中遇到过“隐语义模型”,也只是刚刚接触。那么,什么是隐语义模型?我们通过两个例子来理解一下。

向用户推荐物品

在推荐系统中,可以通过隐含语义模型将用户(user)和物品(item)自动分类,这些类别是自动生成的。这些类别也可以叫做“隐含的分类”,也许我们看不懂。每个用户或者物品会被分到多个类别中,属于某个类别的权重会被计算出来。

假设现在有一个大小为m×n的评分矩阵V,包含了m个用户对n个物品的评分,评分从0到5,值越大代表越喜欢,0代表没有打分。设定共有r个隐含的分类。通过一些方法,将V展开为两个相乘的矩阵:

V = W*H

其中,W的大小为m×r,H的大小为r×n。在隐语义模型中,W(i,j)被解释为用户i属于类别j的权重,H(a,b)被解释为物品b属于类别a的的权重。

如果用户u对物品i没有评分,可以将这个评分r(u,i)预测为:

r(u,i) = sum(W(i, :) .* H(:, i))  // 向量点乘

据此可以构建一个推荐系统。

文本分类

这个类似上面的推荐系统。我在 词袋模型与文档-词矩阵介绍过文档-词矩阵。我们将数据集中的一堆文本构造成文档-词矩阵V,如果共有m个文本,n个单词,那么V的大小为m×n。V(i,j)表示文档i中出现单词j的次数。

设定共有r个隐含的分类。通过一些方法,将V展开为两个相乘的矩阵:

V = W*H

其中,W的大小为m×r,H的大小为r×n。在隐语义模型中,W(i,j)被解释为文档i属于类别j的权重,H(a,b)被解释为单词b属于类别a的的权重。

对于一个文档,其权重最大的类别被看作是该文档的类别。由于设定共有r个隐含的分类,分类结果也是r个份分类。

NMF

NMF,全称为non-negative matrix factorization,翻译为“非负矩阵分解”,可以用于隐语义模型。非负矩阵,就是矩阵中的每个元素都是非负的。将非负矩阵V分解为两个非负矩阵W和H的乘,叫做非负矩阵分解。那么,该怎么分解呢?在下面的这篇论文里,给出了两个方法并给出了证明。

Lee D D, Seung H S. Algorithms for non-negative matrix factorization[C]//Advances in neural information processing systems. 2001: 556-562.

方法1

定义:

[latex] ||A-B||^2 = \sum_{ij}(A_{ij} - B_{ij})^2 [/latex]

目标是最小化[latex]||V-WH||^2[/latex],初始化W和H后(可以将每个元素利用随机数初始化),按照下面的原则迭代更新W和H,直到W和H几乎不再变化,或者WH非常接近V。

方法2

定义: [latex] D(A||B) = \sum_{ij} (A_{ij} log\frac{A_{ij}}{B_{ij}} - A_{ij} + B_{ij}) [/latex]

当[latex]\sum_{ij}A_{ij} = \sum_{ij}B_{ij} = 1[/latex]时,上面的式子就退化成了KL散度(或者叫相对熵)

这个方法的目标是最小化[latex]D(V||WH)[/latex]。初始化W和H后(可以将每个元素利用随机数初始化),按照下面的原则迭代更新W和H,直到W和H几乎不再变化,或者WH非常接近V。

参考

项亮的《推荐系统实践》在第2章第5节提到了隐语义模型,并给出了一个基于梯度下降的矩阵分解方法(不是NMF)。

《集体智慧编程》第10章给出了NMF的浅显解释以及python实现。

下面的这篇论文探索了如何使用NMF进行文本分类:

Xu W, Liu X, Gong Y. Document clustering based on non-negative matrix factorization[C]//Proceedings of the 26th annual international ACM SIGIR conference on Research and development in informaion retrieval. ACM, 2003: 267-273.



( 本文完 )