Пример алгоритма сходства пользователей по рейтингу - PullRequest
0 голосов
/ 25 марта 2012

Я создаю механизм рекомендаций и пытаюсь преодолеть проблему нового пользователя.Я хочу попросить новых пользователей оценить выбранное количество элементов, а затем выяснить, с какими другими пользователями они наиболее похожи.Затем, используя данные от аналогичных пользователей, чтобы сгенерировать первоначальные рекомендации.

Я не уверен, как это сделать, поскольку я ранее работал над рекомендациями по пунктам.У кого-нибудь есть пример этого?Либо некоторый псевдокод, либо реализация на любом языке (желательно не на функциональном языке).

Мне кажется, я ищу алгоритм ближайшего соседа, основанный на пользователе, но не уверен.

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 25 марта 2012

Проблема холодного запуска не указана для реализации, основанной на сходстве пользователя и пользователя. Как вы решили эту проблему в реализации, основанной на сходстве предметов?

Вы уже предложили один подход: заставить пользователя предоставить вам данные. Если это возможно, это отличный ответ. В идеале вы выбираете предметы, которые разнообразны - не очень похожи между собой.

Нет ничего плохого в том, чтобы показывать простой список топ-10 в качестве рекомендаций перед тем, как получать какие-либо данные, а затем начинать давать рекомендации как можно лучше, как только у вас будет 1 пункт данных. Это "нормальный" способ для меня.

1 голос
/ 25 марта 2012

Это можно обозначить как проблему активного обучения. Karimi, Freudenthaler, Nanopoulos и Schmidt-Thieme (2011) дают один способ справиться с этим в условиях факторизации матрицы, но у IMO есть куча проблем с их подходом (и мне приходится работатьв лучшую сторону, хотя на данный момент он слишком медленный, чтобы его можно было использовать).

Основной вопрос: какие пункты скажут мне больше всего о предпочтениях этого нового пользователя?Не зная специфики вашего механизма рекомендаций, сложно сказать больше, чем выбрать несколько относительно разнообразных элементов, о которых пользователи могут иметь мнения (например, популярные фильмы из разных жанров).

0 голосов
/ 26 марта 2012

Вот моя первая попытка решить эту проблему. Я прошу всех новых пользователей оценить ряд разнообразных продуктов. Затем я идентифицирую 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');

}
...