“咳,我老婆最近买了个口红,然后加了个群,那个群里天天就分享什么购物经验啦,哪里哪里又上新啦,结果我老婆越买越多...”
是啊,我喜欢看科幻片,如果他们也爱看科幻片,并且告诉我了一些我没看过的,我肯定想看啊。
“哟,你说的还真有道理,上次那个基于内容的推荐,我记得只考虑一个用户自己的喜好,忽略了其他人,你的意思是我们可以找到相同喜好的人,然后把他们看过的电影互相推荐一下?”
你买的书都看了吗,这不就是书里的协同过滤算法吗?
“啊?是吗,哈哈哈。最近还真没看,这不是天天操心我老婆这烦心事嘛。”
得了吧。你就是懒。
“不过你还别说,从口红群那个事儿啊,我觉得这种方式肯定靠谱。不过协同过滤,这名字听着真是别扭。”
你一听这恶心的名字,那肯定是翻译过来的咯。协同就是利用其它用户的喜好,比如他们对电影打的分,过滤嘛,就是滤出你要的东西咯,比如推荐给某个用户的电影啊。
“哦,那具体是怎么弄?”
简单,就是填空。
“填空?填什么空?”
你看,这里有个表,里面填的是每个用户对每个电影打的分数。但是你想想,一个人怎么可能看过所有的电影呢? 我们就是把这些空给填上,也就是猜猜他会给这些没看过的电影打多少分,把他可能打高分的电影推荐给他就好啦。
“哦,我懂了,可这空怎么填啊。我怎么知道他会打多少分啊。”
用协同过滤咯,看看别的人打多少分呗。
“你是说算一下其他人给这个电影打分的平均值?不对吧,那不成了高分电影推荐嘛,所有人都会推一样的电影啊。”
当然不是了。我们得找到他相似的人。
“那怎么去衡量两个人相似呢?”
最简单的就这样,用我们都看过的电影数除以我看过的加上你看过的。
你看 A 和 B 这两个人,他们都看过的电影只有 1 个,就是 HP1,他们一共看过的是 5 个,重复的不算哦,HP1,HP2,HP3,TW,SW1,那他们的相似度,1 除以 5 ,就是 0.2, A 和 C 呢,他们的相似度是 2 除 4, 是 0.5。 所以 A 和 C 更相似。
很好懂吧,我们一共就看过 4 个不同的电影,居然有两个是一样的,难道我们口味不是一样的吗?
“听起来不错,可是完全没考虑他们打的分啊。”
那可以用上次我们说的余弦相似度啊,我们把这些空着的地方当做 0 就好了。
用户 A 可以表示为 [4, 0, 0, 5, 1, 0, 0], B 可以表示为 [5, 5, 4, 0, 0, 0, 0],
C 可以表示为 [0, 0, 0, 2, 4, 5, 0], 所以 A 和 B 的相似度是 0.38,而 A 和 C 的相似度是 0.32,所以 A 和 B 更相似一些。
“这样直接用 0 填不行的吧。这不是在假设他打了 0 分么,说不定他很喜欢,会打 5 分呢。”
嗯,那这样吧,我们填这个用户所有打分的平均分吧,然后再把他所有的分都减去这个平均分,比如,A 用户打分的平均分是 (4 + 5 + 1) /3 ,我们先把用户 A 变成 [4, 10/3, 10/3, 5, 1, 10/3, 10/3], 然后每个值再减去平均分 10/3, 得到 [2/3, 0, 0, 5/3, -7/3, 0, 0]。这样的话,每个分值就是他喜欢或者讨厌的程度了,得负数的电影他肯定是不喜欢吧。
“这个好,这样的话爱打高分的人和爱打低分的人也能放在一起比较了。”
行,那就先用这种方法吧。
“别急啊,找到相似的人了之后呢,不是还要填空么?”
跟他相似的人打了多少分,就认为他也会打多少分咯。
“ok,那我就找跟他最相似的 5 个人,算他们每个人对这个电影打的平均分吧。这个当做他会对这个电影打的分数。”
别忘了,跟他 最相似的 5 个人,相似程度也是不一样的,所以,还得考虑一下。
“ok,小意思,我知道怎么弄了。”