【问题标题】:Ratings based user similarity algorithm example基于评分的用户相似度算法示例
【发布时间】:2012-03-24 20:49:35
【问题描述】:

我正在构建推荐引擎并尝试克服新用户问题。我想请新用户对选定数量的项目进行评分,然后找出与他们最相似的其他用户。然后使用来自相似用户的数据生成初始推荐。

我不确定如何执行此操作,因为我之前曾处理过逐项推荐。有没有人有这方面的例子?一些伪代码或任何语言的实现(最好不是功能语言)。

我想我正在寻找基于用户的最近邻算法,但不确定。

提前致谢

【问题讨论】:

    标签: algorithm machine-learning collaborative-filtering


    【解决方案1】:

    冷启动问题未指定给基于用户-用户相似性的实现。您是如何在基于项目相似度的实现中解决这个问题的?

    您已经提出了一种方法:让用户向您提供数据。如果这是可行的,那是一个很好的答案。理想情况下,您会选择多样化的项目——它们之间不是很相似。

    在您拥有任何数据之前将简单的前 10 名列表显示为建议并没有那么错误,然后从拥有 1 个数据点的那一刻开始尽可能地推荐。这对我来说是“正常”的方式。

    【讨论】:

    • 我还没有解决item-item冷启动问题。目前,大多数推荐都是使用所有项目的矩阵来完成的,该矩阵带有任何用户喜欢任何两个项目的次数的计数器。例如,如果 userA 喜欢 item1、item2 和 item3,而 userB 喜欢 item1 和 item3,则矩阵看起来像 (item1, item2) 1, (item1, item3) 2 等。对于新用户推荐,我想使用用户-用户评分相似性,因为我认为这些建议将更加相关。如果他们不是我学到了一些新东西:)
    • 好的。但是,您的共现计数不会帮助您计算用户-用户相似度。为此,您确实需要用户-用户同时出现。但这是一个切线。我认为对您来说最好的答案是根据您的第一个评分计算推荐,并在您没有​​评分时显示前 10 个列表。
    • 感谢您的建议。我曾经要求用户在他们首次注册该网站时对产品进行评分。然后为初始推荐识别相似的用户,直到我可以使用共现计数。我将粘贴下面的代码。
    【解决方案2】:

    这可以被定义为一个主动学习问题。 Karimi, Freudenthaler, Nanopoulos, and Schmidt-Thieme (2011) 提供了一种在矩阵分解设置中处理它的方法,但是 IMO 的方法存在很多问题(我碰巧正在研究一种更好的方法,尽管目前它太慢而无法使用)。

    基本问题是:哪些项目最能告诉我这个新用户的偏好?在不了解您的推荐引擎的细节的情况下,很难说比选择一些用户可能有意见的相对多样化的项目(例如来自不同类型的热门电影)。

    【讨论】:

    • 感谢您的建议。我将在第一次注册时询问用户,对许多不同的项目进行评分,以识别相似的用户以获得初始推荐。我将粘贴下面的代码。
    【解决方案3】:

    这是我第一次尝试解决这个问题。我要求所有新用户对许多不同的产品进行评分。然后我根据这些评级确定与他们最相似的 3 个现有用户。然后我可以使用我掌握的关于这三个用户的信息在他们第一次访问该站点时推荐这些项目。

    感谢所有给我建议的人:)

    /**
    
         * Select all of the customer ratings
         */
    
    $rows = getRows("SELECT * FROM customer_ratings;", 'NUM');
    
    if(isset($_POST['submit'])){
    
        //Fill distanse array to zero for all items
        $distance = array_fill(0, count($rows), 0);
    
        $instance = $_POST['instance'];
    
    
        //Loop over each of the exisiting ratings rows
        for($i = 0; $i < count($rows); $i++) {
            //Loop over the 5 items (The first two are id and name we only need 2-6)
            for($j = 2; $j < 7; $j++) {
                    $distance[$i] += abs(($rows[$i][$j] - $instance[$j]));
            }
        }
    
        //Sort distances by ascending order
        asort($distance);
    
        $distanceCopy = $distance;
    
        $stringBuff = "";
    
        //Select the three most similar
        for($i = 0; $i < 3; $i++){
            $maxs = array_keys($distanceCopy, min($distanceCopy));
            $stringBuff = $stringBuff . " ". ($maxs[0]+1) .",";
            unset($distanceCopy[$maxs[0]]);
        }
    
        $stringBuff = substr_replace($stringBuff,"", -1);
    
        echo "String buff: ".$stringBuff;
    
        $mostSimilar = getRows("SELECT name FROM customer_ratings WHERE id IN ($stringBuff);", 'NUM');
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-15
      • 2023-03-23
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多