使用简化版协同过滤程序来计算相关视频、相关商品,PHP也能轻松实现

虽然之前有研究过也在项目中用过协同过滤,但并没有很深入的理解,只是有一些大致的概念并且会通过调用 mahout 提供的 API 来算出一些推荐罢了。最近重新做了研究并终于搞清楚其中一部分原理,本文即做一些记录。

因为网络上关于协同过滤的基本解释的文章很多,所以这里就不做重复的基本介绍,可以参照 http://bluewhale.cc/2016-03-11/collaborative-filtering.html 或者 https://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy2/

本文将专注于仅实现相关视频、相关商品推荐,也前面所列文章里面即寻找相似的物品。在这些文章中,都有出现一些公式,比如欧几里德距离评价公式:

欧几里德距离评价公式

这个公式的中,x、y 分别指物品x物品y,d(x,y)即物品x和物品y之间的距离;而 xi、yi则分别指第i个用户对物品x物品y的评分。

虽然这些文章中的例子都是需要用户的评分来计算相关度,但实际中,使用观看或购买行为也一样可以计算,我们把用户A观看过的评分记为1,没有观看过记为0就可以了。但是对于这种情况,欧几里德距离评价公式就变得非常的不适用了,因为在这个公式中,xi-yi对于用户i两部都观看过以及两部都没有观看过的计算值是一样的。

在这个场景下,使用 Jaccard(Tanimoto) 相似度计算公式就更加的适合。

Jaccard(Tanimoto) 相似度计算公式

解释下这个公式,等式左边也即物品A和B的相似度,在我们只存在0和1的观看行为系统中,就等于同时看过A和B的用户数量除于看过A或者看过B的用户数量了

原理以及公式清楚了,那么要做实现计算就很简单了,因为我们简化了之后的最终公式非常的简单。在PHP当中也能很轻松的进行实现

实现代码放在github中,可点此链接前往查看,这里做些简单说明:

play-log.gz 文件中的日志数据来自于千寻影视的真实用户记录,不过只随机选取了其中很小的一部分,故使用该测试数据计算下来的结果不是很理想,该数据放置在这里仅为了提供使用样例

This entry was posted in Uncategorized. Bookmark the permalink.

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


Verify Code   If you cannot see the CheckCode image,please refresh the page again!