首页 文章

使用矩阵分解为推荐系统

提问于
浏览
12

我正在使用C#6.0中基于项目的协作过滤器为餐馆推荐一个推荐系统 . 我想设置我的算法以尽可能好地执行,所以我已经做了一些关于预测用户尚未审查的餐馆评级的不同方法的研究 .

I'll start with the research I have done

首先,我想使用用户之间的皮尔逊相关性来设置基于用户的协作过滤器,以便能够看到哪些用户很好地融合在一起 .
这个问题的主要问题是能够计算这种相关性所需的数据量 . 首先,您需要在同一家餐厅每2位用户进行4次评论 . 但我的数据将非常稀少 . 这不是快餐店的快餐'. Which of these would fit best with the other user'的评论?

经过更多的研究,我得出结论,基于项目的协作过滤器优于基于用户的协作过滤器 . 但同样,我遇到了数据稀疏性问题 . 在我的测试中,我成功地计算了用户没有足够好的餐馆评级的预测 . (大多数时候,两家餐馆之间不可能有相似之处,因为没有2位用户评价同一家餐厅) .
经过更多的研究,我发现使用矩阵分解方法可以很好地处理稀疏数据 .

Now my problem

我一直在互联网上寻找使用这种方法的教程,但我没有任何推荐系统的经验,而且我对代数的知识也是有限的 . 我理解方法的正确性 . 你有一个矩阵,你有1边用户,另一边有餐馆 . 每个单元格是用户在餐厅上给出的评级 .
矩阵分解方法创建两个这样的矩阵,一个具有用户和餐馆类型之间的权重,另一个具有餐馆和这些类型之间的权重 .

我无法弄清楚的是如何计算餐厅类型和餐馆/用户之间的权重(如果我正确理解矩阵分解) . 我找到了几十个计算这些数字的公式,但我无法弄清楚如何将它们分解并应用于我的应用程序中 .

我将举例说明数据在我的应用程序中的外观:
在该表中,U1代表用户,R1代表餐馆 . 每个餐厅都有自己的标签(餐厅类型) . 即R1的标签为'Italian',R2的标签为'Fast food'等 .

|  R1  |  R2  |  R3  |  R4  |
U1 |  3   |  1   |  2   |  -   |
U2 |  -   |  3   |  2   |  2   |
U3 |  5   |  4   |  -   |  4   |
U4 |  -   |  -   |  5   |  -   |

有没有人可以指出我正确的方向或解释我应该如何在我的数据上使用这种方法?任何帮助将不胜感激!

1 回答

  • 2

    矩阵分解假设“潜在因素”,例如对用户的意大利食物的偏好和项目食物的意外性与矩阵中的评级有关 .

    因此,整个问题类型转变为矩阵重构问题,存在许多不同的解决方案 . 一个简单的,可能很慢的解决方案是(除了ALS和其他一些矩阵重建的可能性)使用梯度下降算法逼近矩阵 . 我推荐这篇简短的文章ieee article about recommender systems .

    提取潜在因素是一个不同的问题 .

    因此,GDM的实现可能如下所示:

    public void learnGDM(){
    //traverse learnSet
    for(int repeat = 0; repeat < this.steps; repeat++){
        for (int i = 0; i < this.learnSet.length; i++){
            for (int j = 0; j < this.learnSet[0].length; j++){
                if(this.learnSet[i][j] > 0.0d){
                    double Rij = this.learnSet[i][j];
    
                    for(int f = 0 ; f <= latentFactors; f++){
                        double error = Rij - dotProduct(Q.getRow(i), P.getRow(j));/*estimated_Rij;*/
                        //ieee computer 1.pdf
                        double qif = Q.get(i, f);
                        double pif = P.get(j, f);
                        double Qvalue = qif + gradientGamma * (error * pif - gradientLambda * qif);
                        double Pvalue = pif + gradientGamma * (error * qif - gradientLambda * pif);
                        Q.set(i,f, Qvalue);
                        P.set(j, f, Pvalue);
                    }
                }
            }
        }
        //check global error
        if(checkGlobalError() < 0.001d){
            System.out.println("took" + repeat + "steps");
            break;
        }
    }
    

    学习集是包含评级矩阵的二维数组,如ieee文章中所述 . GDM算法每次迭代一次改变评级向量P和Q,以便它们接近评级矩阵中的评级 . 然后可以通过P和Q的点积计算“未给定”等级 . 然后,对于未给定的等级,最高估计将是推荐 .

    这就是它的开始 . GDM的许多优化和其他算法或修改版本也可以并行运行 .

    一些好的读物:

    recommender systems in the Encyclopedia of Machine Learning

    presentation on matrix factorization

    recommender systems <---大一个^^

相关问题