【问题标题】:How does matrix decomposition help fill in a sparse utility/ratings matrix for new users?矩阵分解如何帮助为新用户填充稀疏效用/评级矩阵?
【发布时间】:2016-10-04 15:24:57
【问题描述】:

这是我第一次尝试机器学习。我正在使用 yelp 数据集编写一个非常简单的推荐引擎。它是用 python 编写的,使用 pandas 和 numpy 库进行(数据处理)。我已经首先将数据范围缩小到餐厅(百万),然后只限于拉斯维加斯的餐厅(千),然后只有 3.5 星或更高且评论超过 50 条的餐厅(数百条)。此外,我将用户范围缩小到仅评论了至少 20% 餐厅的用户。最后,我得到了一个评分矩阵,其中包含 1800 家餐厅的 100 名用户。

但是,我觉得提供(相对)有用的建议仍然很少。目标是利用余弦相似度,使用基于项目-项目协同过滤计算向量距离。

我一直在阅读有关处理稀疏矩阵的文章,而共识似乎是使用矩阵分解。然而,这些读数中的大多数似乎都处理当前用户,并使用矩阵分解作为驱动当前用户推荐的算法,同时解决作为副产品的稀疏问题。我的理解在这里正确吗?我正在寻找的是一种首先解决稀疏问题然后使用余弦向量距离来指导推荐的方法。

如果分解实际上是要走的路:我应该使用什么sklearn.decomposition 方法,即 PCA、SVD、NMF?

[[ 3, 0, 0, ..., 0, 0, 0],
[ 0, 0, 0, ..., 0, 0, 0],
[ 0, 0, 0, ..., 0, 4, 3],
...
[ 1, 0, 0, ..., 0, 0, 0],
[ 0, 0, 0, ..., 0, 0, 2],
[ 0, 0, 5, ..., 0, 1, 3]] 

(100 位用户 X 1800 家餐厅)

【问题讨论】:

    标签: python matrix scikit-learn recommendation-engine yelp


    【解决方案1】:

    减少评分数量并不是提高推荐准确性的好解决方案(至少直接如此)。 也就是说,稀疏不是一个“大”问题。事实上,推荐的分解算法旨在处理这种稀疏度高达:99%、98%、95% 的稀疏度。

    目前,矩阵分解给出了最好的结果,而且它的概念非常简单。此外,与基于模型的 CF 方法相比,基于内存的 CF 方法(如基于项目、基于用户等)效率更低、灵活性更低且结果更差。

    最流行的算法都是基于 SVD:

    • Funk 的 SVD(也称为 SVD,虽然不是真正的 SVD。它是一个近似值。)
    • BRISM​​F(Funk 的有偏正则化版本)
    • SVD++:BRISM​​F 加上隐式反馈信息。
    • timesSVD:SVD++ 也可以模拟日期时间
    • trustSVD:SVD++,包括信任信息(如朋友)

    这些算法的基础包括:

    1. 创建一些低秩矩阵并随机初始化它们
    2. 对于数据集中的每个评级,计算与您的预测相关的误差。
    3. 使用您正在优化的函数的梯度更新低秩矩阵
    4. 重复

    Python 示例 (BRISM​​F):

    # Initialize low-rank matrices (K is the number of latent factors)
    P = np.random.rand(num_users, K)  # User-feature matrix
    Q = np.random.rand(num_items, K)  # Item-feature matrix
    
    # Factorize R matrix using SGD
    for step in range(steps):
    
        # Compute predictions
        for k in range(0, len(data)):
            i = data.X[k, user_col]  # Users
            j = data.X[k, item_col]  # Items
            r_ij = data.Y[k]  # rating(i, j)
    
            # NOTE: For simplicity (here) I've considered the 
            # bias a standard deviation, but it should be
            # learned for better accuracy.
            bias = global_avg + std_user[i] + std_item[j]
    
            # Make prediction and compute error
            rij_pred = bias + np.dot(Q[j, :], P[i, :])
            eij = rij_pred - r_ij
    
            # Update P and Q at the same time, they're dependents
            tempP = alpha * 2 * (eij * Q[j, :] + beta * P[i, :])
            tempQ = alpha * 2 * (eij * P[i, :] + beta * Q[j, :])
            P[i] -= tempP
            Q[j] -= tempQ
    

    额外

    • 出于速度原因(以及代码的简单性),我建议您将所有内容矢量化
    • 如果需要,请尝试创建缓存。即使使用正确的数据结构,在稀疏矩阵中的访问也会非常缓慢。
    • 这种算法在计算上非常昂贵,因此对于简单版本,您可以期望在 1,000,000 个评级的数据集中花费 10s/iter
    • 我正在为 Orange3 数据挖掘构建一个简单的库,所以如果您有兴趣可以看看:https://github.com/biolab/orange3-recommendation

    【讨论】:

      猜你喜欢
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2012-07-28
      • 2023-04-05
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多