【0-1】矩阵分解

12 篇文章 0 订阅
7 篇文章 0 订阅

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

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

 

无论是基于数值的矩阵分解如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使用最小二乘优化的根本。

  

 以上。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
矩阵链乘问题是一个经典的动态规划问题,其目标是找到一种最优的方式来计算给定的一组矩阵的连乘积。这个问题可以通过动态规划算法来解决。 动态规划算法的基本思想是将问题分解成更小的子问题,并使用已知的信息来计算更大的问题。在矩阵链乘问题中,我们可以将问题分解成计算两个矩阵的乘积的子问题,并使用已知的信息来计算更大的问题。 具体来说,我们可以定义一个二维数组m,其中m[i][j]表示从第i个矩阵到第j个矩阵的最小计算代价。我们还可以定义一个二维数组s,其中s[i][j]表示从第i个矩阵到第j个矩阵的最优计算次序。 接下来,我们可以使用以下递归公式来计算m和s: m[i][j] = 0 (i = j) m[i][j] = min{m[i][k] + m[k+1][j] + ri*ck*cm} (i <= k < j) 其中,ri和ci分别表示第i个矩阵的行数和列数,cm表示两个矩阵相乘的计算代价。 使用上述递归公式,我们可以计算出所有的m[i][j]和s[i][j]。最终,我们可以通过s数组来构造出最优的计算次序,并使用m数组来计算最小的计算代价。 下面是一个Python实现的例子: ```python def matrix_chain_order(p): n = len(p) - 1 m = [[0] * n for i in range(n)] s = [[0] * n for i in range(n)] for l in range(2, n+1): for i in range(n-l+1): j = i + l - 1 m[i][j] = float('inf') for k in range(i, j): q = m[i][k] + m[k+1][j] + p[i]*p[k+1]*p[j+1] if q < m[i][j]: m[i][j] = q s[i][j] = k return m, s def print_optimal_parens(s, i, j): if i == j: print("A{}".format(i+1), end='') else: print("(", end='') print_optimal_parens(s, i, s[i][j]) print_optimal_parens(s, s[i][j]+1, j) print(")", end='') p = [30, 35, 15, 5, 10, 20, 25] m, s = matrix_chain_order(p) print_optimal_parens(s, 0, len(p)-2) print("\nMinimum cost:", m[0][len(p)-2]) ``` 输出结果为: ``` ((A1(A2A3))((A4A5)A6)) Minimum cost: 15125 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值