基于评级的用户相似度算法示例

时间:2012-03-24 20:49:36

标签: algorithm machine-learning collaborative-filtering

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

我不确定如何执行此操作,因为我之前已经处理过逐项建议。有没有人有这样的例子?一些伪代码或任何语言的实现(最好不是函数式语言)。

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

提前致谢

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

这可以被视为主动学习问题。 Karimi, Freudenthaler, Nanopoulos, and Schmidt-Thieme (2011)给出了一种在矩阵分解设置中处理它的方法,但是IMO的方法存在很多问题(我碰巧在更好的方式上工作,尽管现在它太慢而无法使用)。

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

答案 2 :(得分:0)

这是我第一次尝试解决这个问题。我要求所有新用户评价一系列不同的产品。然后,我根据这些评级确定他们最相似的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');

}