我正在构建推荐引擎并尝试克服新用户问题。我想让新用户对选定数量的项目进行评分,然后找出他们最相似的其他用户。然后使用来自类似用户的数据生成初始建议。
我不确定如何执行此操作,因为我之前已经处理过逐项建议。有没有人有这样的例子?一些伪代码或任何语言的实现(最好不是函数式语言)。
我认为我正在寻找基于用户的最近邻居算法,但不确定。
提前致谢
答案 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');
}