`

【0-1】矩阵分解

阅读更多

基于矩阵分解的推荐算法已经在工业界被广泛应用。

这类算法希望用同一个空间的维度来描述推荐过程中两个实体(用户、物品)的隐语义的特征。

 

无论是基于数值的矩阵分解如PMF[SVD],还是基于概率的矩阵分解如PLSA、LDA,都是如此。

只不过,用于PMF分解的评分矩阵中包含了用户对所访问物品的评分,而PLSA、LDA面对的数据则只能是用户有过某种访问行为的物品集合。

 

仅从信息量的角度看,PMF分解的评分矩阵中含有更多的用户行为信息。

而把数据从矩阵的角度看,与PMF相比,LDA、PLSA面对的则是一个评分全为1的矩阵。

 

 

我们的问题:

今天我们讨论的也是一个类似的问题,我们需要将推荐中的两个实体(用户、物品)映射到同一个隐语义空间。但问题在于,我们拿到的数据既不是像PMF所面对的用户评分矩阵,也不像LDA、PLSA面对的集合数据。而是介于两者之间的一个0-1矩阵。

 

当然我们可以将它视为用户评分矩阵的退化版(评分值域仍为连续空间,只不过取值只有0,1),也可以把它看成一个二分类问题的类别标签(0,1非同一个维度上的评分大小,而代表两种不同的判别类型)。

 

基于数值评分矩阵分解的方法:

如果我们将它看作一个退化(只有0,1评分)的评分矩阵,则可利用PMF直接对其分解。

但不要忘了,PMF或SVD采用最小二乘的方式来拟合矩阵评分,前提是假设评分误差服从正太分布。

虽然也可以大胆假设,但总觉的怪怪的。感觉有点像面对label只有0,1的数据时用线性回归来搞一样的别扭。

 

基于概率矩阵分解的方法:

当然,我们可以尝试使用一些LDA的变种算法来支持这样的数据。我们可以将该数据看成是两份数据,用文档-词主题模型领域行话来讲则叫做"语料库"。

而0,1 分别是这两个语料库的标识。这样我们可以使用算法:Collective Latent Dirichlet Allocation 来对该矩阵进行分解。

盒模型如下:

该方法假设多个语料库之间的topic可以共享,相比传统LDA的每个topic则只需要维护一个在不同word上的分布,该方法还需要为每个topic维护一个在不同语料库上的多项式分布。

此时,0,1被看做离散变量,其本身不代表任何用户对物品的偏好信息。既然这样,该方式就不限于二值离散表达,C变量可以是0,1。也可以使0,1,2...N,或者是A,B,C,,,。

 

该方法的好处是可以同时使用多个同领域的语料库来对topic进行约束,语料库越多,效果越好。但面对这份0-1矩阵数据,这种优势则较难体现。相反,数据中0,1之间的相对关系则被忽略。

 

我们的方法: 

我们希望从一个新的视角来审视拿到的数据:

    首先:0,1评分本身作为评分是有意义的,其体现了用户对物品的喜欢[讨厌]信息。

    其次:0,1评分代表了用户对物品偏好的两个维度[方向],而不是一个维度上的两个值。

 

参考逻辑回归的实现,我们将每一个[0-1]评分过程看成一个(n=1)的n重的伯努利实验

则,我们的优化目标即是最大化如下公式:——假设每条数据之间独立同分布

 

        

其中,theta就是我们要求解的模型。

 

使用似然函数将上述目标具体化之后,得到:

        

 

取对数之后:

        

 

展开之后:

        

 

进一步合并推导:

         

 

又因为有:

           

 

因此,我们的问题就变为:

            

 

对应的最小化问题为:

          

 

我们采用SGD的方法来求解该最小化问题,则分别对"u"和“i"求偏导,如下:

       

偏导即为梯度下降的方向,剩下的就只是迭代求解了,迭代公式如下:

         

 

 

与PMF的对比:

  • 其与PMF的本质差异就在于似然函数的选择,PMF假定残差服从高斯分布,则似然函数为:

        

        这也是PMF使用最小二乘优化的根本。

  

 以上。

 

 

 

  • 大小: 11.1 KB
  • 大小: 7.2 KB
  • 大小: 7.8 KB
  • 大小: 8 KB
  • 大小: 7.9 KB
  • 大小: 7.6 KB
  • 大小: 6.7 KB
  • 大小: 6.8 KB
  • 大小: 8.6 KB
  • 大小: 8.4 KB
  • 大小: 14 KB
  • 大小: 12 KB
  • 大小: 1.4 KB
1
0
分享到:
评论
1 楼 u012772662 2017-11-11  
您好,请问有参考的论文吗?

相关推荐

Global site tag (gtag.js) - Google Analytics