cst*_*ur4 22 recommendation-engine mahout mahout-recommender
我很困惑基于项目的推荐是什么,正如" Mahout in Action " 一书中所描述的那样.书中有算法:
for every item i that u has no preference for yet
for every item j that u has a preference for
compute a similarity s between i and j
add u's preference for j, weighted by s, to a running average
return the top items, ranked by weighted average
Run Code Online (Sandbox Code Playgroud)
如何计算项目之间的相似度?如果使用内容,是不是基于内容的推荐?
gre*_*ess 101
原始的基于项目的推荐完全基于用户项目排名(例如,用户评价具有3星的电影,或者用户"喜欢"视频).当您计算项目之间的相似性时,除了所有用户的评分历史之外,您不应该知道任何其他内容.因此,项目之间的相似性是基于评级而不是项目内容的元数据来计算的.
让我给你举个例子.假设您只能访问以下某些评级数据:
user 1 likes: movie, cooking
user 2 likes: movie, biking, hiking
user 3 likes: biking, cooking
user 4 likes: hiking
Run Code Online (Sandbox Code Playgroud)
假设您现在想要为用户4提出建议.
首先,为项目创建倒排索引,您将获得:
movie: user 1, user 2
cooking: user 1, user 3
biking: user 2, user 3
hiking: user 2, user 4
Run Code Online (Sandbox Code Playgroud)
由于这是二进制评级(喜欢与否),我们可以使用像Jaccard Similarity这样的相似性度量来计算项目相似度.
|user1|
similarity(movie, cooking) = --------------- = 1/3
|user1,2,3|
Run Code Online (Sandbox Code Playgroud)
在分子中,user1是电影和烹饪都具有的唯一元素.在分母中,电影和烹饪的结合有3个不同的用户(用户1,2,3).|.|这里表示集合的大小.所以我们知道电影和烹饪之间的相似性在我们的情况下是1/3.你只对所有可能的项目对做同样的事情(i,j).
完成所有对的相似度计算后,您需要为用户4提出建议.
similarity(hiking, x)x是您可能拥有的任何其他标签的相似性得分.如果您需要为用户3提出建议,您可以汇总其列表中每个项目的相似性得分.例如,
score(movie) = Similarity(biking, movie) + Similarity(cooking, movie)
score(hiking) = Similarity(biking, hiking) + Similarity(cooking, hiking)
Run Code Online (Sandbox Code Playgroud)
基于内容的要点是我们必须知道用户和项目的内容.通常,您使用共享属性空间的内容构建用户配置文件和项目配置文件.例如,对于电影,您可以用它中的电影明星和类型(例如使用二进制编码)来表示它.对于用户配置文件,您可以根据用户喜欢某些电影明星/流派等来做同样的事情.然后,可以使用例如余弦相似度来计算用户和项目的相似性.
这是一个具体的例子:
假设这是我们的用户配置文件(使用二进制编码,0表示不喜欢,1表示类似),其中包含用户对5个电影明星和5个电影类型的偏好:
Movie stars 0 - 4 Movie Genres
user 1: 0 0 0 1 1 1 1 1 0 0
user 2: 1 1 0 0 0 0 0 0 1 1
user 3: 0 0 0 1 1 1 1 1 1 0
Run Code Online (Sandbox Code Playgroud)
假设这是我们的电影配置文件:
Movie stars 0 - 4 Movie Genres
movie1: 0 0 0 0 1 1 1 0 0 0
movie2: 1 1 1 0 0 0 0 1 0 1
movie3: 0 0 1 0 1 1 0 1 0 1
Run Code Online (Sandbox Code Playgroud)
为了计算电影对用户的好坏,我们使用余弦相似度:
dot-product(user1, movie1)
similarity(user 1, movie1) = ---------------------------------
||user1|| x ||movie1||
0x0+0x0+0x0+1x0+1x1+1x1+1x1+1x0+0x0+0x0
= -----------------------------------------
sqrt(5) x sqrt(3)
= 3 / (sqrt(5) x sqrt(3)) = 0.77460
Run Code Online (Sandbox Code Playgroud)
同理:
similarity(user 2, movie2) = 3 / (sqrt(4) x sqrt(5)) = 0.67082
similarity(user 3, movie3) = 3 / (sqrt(6) x sqrt(5)) = 0.54772
Run Code Online (Sandbox Code Playgroud)
如果您想为用户提供一个推荐i,只需选择j最高的电影即可similarity(i, j).
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
23853 次 |
| 最近记录: |