python实现推荐系统(二)

根据(一)所描述的model-based 方法, 在实际大规模数据建模中也用因子分解来近似原先的评分矩阵R。而本篇文章所要介绍的便是交替最小二乘法(Alternating Least Squares),通过评分矩阵R,user-item  找到近似的k维矩阵S(上文提到的) ,最终R(m×n)可以用两个矩阵来表示U(m×k),I(k×n),这样子,对于R(i,j)的值可以用U(i,:).*I(:,j)来近似 ,即U中i行 与 I中的j列 点乘的和 , 虽然评分矩阵R是稀疏的,但是他的两个因子矩阵却是稠密的,U称为用户因子矩阵,I称为物品因子矩阵,U和I 矩阵难以直接解释其中隐含的特征。 

然后介绍ALS算法,   即求出U 和 I (相应的为P和Q )  , 用平方损失函数求最小值,其中λ旁边的为L2 正则项

可以看到我们要求的P 和 Q 都是未知的,是个非凸优化问题,不容易找到全局最优解,而ALS算法用的技巧就是先固定一个变量P,然后求另一个Q,接着固定Q,再求解P,这样子就变成一个凸优化问题,这样不断重复上面过程,直到收敛,就求解出P 和 Q 了,迭代公式由 2008年的一篇论文给出

其中npi 表示 用户i评分过的物品数,nqj就表示物品j被多少用户评分过。

具体实现

for epoch in range(n_epochs):
    # Fix Q and estimate P
    for i, Ii in enumerate(I):
        nui = np.count_nonzero(Ii) # Number of items user i has rated
        if (nui == 0): nui = 1 # Be aware of zero counts!
    
        # Least squares solution
        Ai = np.dot(Q, np.dot(np.diag(Ii), Q.T)) + lmbda * nui * E
        Vi = np.dot(Q, np.dot(np.diag(Ii), R[i].T))
        P[:,i] = np.linalg.solve(Ai,Vi)
        
    # Fix P and estimate Q
    for j, Ij in enumerate(I.T):
        nmj = np.count_nonzero(Ij) # Number of users that rated item j
        if (nmj == 0): nmj = 1 # Be aware of zero counts!
        
        # Least squares solution
        Aj = np.dot(P, np.dot(np.diag(Ij), P.T)) + lmbda * nmj * E
        Vj = np.dot(P, np.dot(np.diag(Ij), R[:,j]))
        Q[:,j] = np.linalg.solve(Aj,Vj)
  • Zhou et al. (2008) Zhou, Y., Wilkinson, D., Schreiber, R. and Pan, R., 2008. Large-scale parallel collaborative filtering for the netflix prize. In Algorithmic Aspects in Information and Management (pp. 337-348). Springer Berlin Heidelberg.
原文地址:https://www.cnblogs.com/who-a/p/5651695.html