首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >推荐系统的矩阵因式分解

推荐系统的矩阵因式分解
EN

Stack Overflow用户
提问于 2016-11-03 10:03:02
回答 1查看 1.4K关注 0票数 13

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

,我将从我做的的研究开始

首先,我想建立一个基于用户的协作过滤器,使用用户之间的pearson相关性,以便能够看到哪些用户能够很好地结合在一起。

这方面的主要问题是能够计算这种相关性所需的数据量。首先,在同一家餐厅,每2名用户需要4次评论。但我的数据将非常稀少。不太可能有2个用户会对相同的4家餐厅进行审查。我想通过扩大匹配条件来解决这个问题(例如,不匹配同一餐厅的用户,而是同一类型的餐馆),但这给我带来了一个问题,我很难确定在相关中使用哪些评论,因为用户可以在一家餐馆上留下3个评论,类型为“快餐店”。其中哪一个最适合其他用户对快餐店的评论?

经过更多的研究,我得出结论:基于项的协作过滤器优于基于用户的协作过滤器。但是,我再次遇到了数据稀疏的问题。在我的测试中,我成功地计算出了一家用户尚未审查的餐馆的评级预测,但当我在稀疏数据集上使用该算法时,结果还不够好。(大多数情况下,两家餐厅之间不可能有相似之处,因为没有2家用户对同一家餐厅进行评级)。

经过更多的研究,我发现使用矩阵因式分解方法可以很好地处理稀疏数据。

现在我的问题

我一直在网上寻找使用这种方法的教程,但我没有任何推荐系统的经验,我的代数知识也是有限的。我理解这种方法的公正性。你有一个矩阵,你有一个一边的用户和另一边的餐厅。每个单元格是用户在餐厅上给出的评级。

矩阵因式分解方法创建了两个矩阵,一个是用户与餐厅类型之间的权重,另一个是餐馆与这些类型之间的权重。

我只是不知道如何计算餐厅类型与餐馆/用户之间的权重(如果我正确理解矩阵分解)。我找到了几十个计算这些数字的公式,但我想不出如何将它们分解并应用到我的应用程序中。

我将给出一个示例,说明我的应用程序中数据的外观:

在这个表中,U1代表用户,R1代表餐馆。每家餐厅都有自己的标签(餐厅类型)。也就是说,R1的标签是‘意大利语’,R2有‘快餐店’等等。

代码语言:javascript
复制
   |  R1  |  R2  |  R3  |  R4  |
U1 |  3   |  1   |  2   |  -   |
U2 |  -   |  3   |  2   |  2   |
U3 |  5   |  4   |  -   |  4   |
U4 |  -   |  -   |  5   |  -   |

是否有人能为我指出正确的方向或解释我应该如何在我的数据上使用这个方法?任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-15 21:33:21

矩阵因式分解假设“潜在因素”,如用户对意大利食物的偏好和商品食物的倾斜性等,都与矩阵中的评级有关。

因此,整个问题转化为一个矩阵重构问题,其中存在许多不同的解。一个简单的,可能是缓慢的,解是(除了ALS和其他一些可能性的矩阵重建)逼近矩阵使用梯度下降算法。我推荐这篇短文ieee关于推荐系统的文章

而潜在因素的提取则是另一个问题。

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

代码语言:javascript
复制
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版本也可以并行运行。

一些很好的读物:

机器学习百科全书中的推荐系统

矩阵因式分解的表示

推荐系统 <-大1 ^^

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40398657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档