Collaborative Filtering
简单说就是,找到和你喜好类似的那群人,看他们买了什么你还没买的东西,推荐给你。
简化举例来说,你买了哈利波特,羽泉的CD,新宋……他会去找其他买了类似产品的同学们:A, B, C。然后他看到A和B都还买了《九州》,就会推荐你《九州》;你买了《沉默的大多数》,买了《黄金时代》,买了《黑铁时代》,系统去找到了其他买这些书的同学们:D, E, F,发现这三位同学都买了《白银时代》,于是把这本书推荐给你。
详细来讲(当然其实还是省略大量实现上的细节),假设www.MarsOpinion.com(我的博客:P)有M个客户,N种产品,就把每个客户当成一个N维的项量,客户见的相似度可以用这两个项量的COS计算:
找到和你“相似”的那些消费者之后,就可以给其他商品打分了,越多和你相似的消费者买了商品X,说明商品X越可能吸引你,所以可以以“有多少和你相似的消费者购买了这个商品”作为这个商品的分数。举例来说:和你相似的消费者中,80个买了《青铜时代》,《白银时代》,70个买了《失乐园》,那么《青铜时代》和《白银时代》分数就是80,《失乐园》分数就是70,要推荐的话就应该先推荐《青铜时代》、《白银时代》,再推荐《失乐园》。
这里还有两点需要考虑,第一是不要推荐客户已经购买的东西,例如如果你已经购买过《青铜时代》,就应该只给你推荐《白银时代》(至少对于书是这样,对于重复购买的消费品再议)。
第二就是要降低那些畅销产品的权重:举例来说,买哈利波特的人动辄百万计,因为你和别人都买了哈利波特而向你推荐他所购买的商品,其实没有什么意义;相反,如果你买了本《MarsOpinion.com电子商务推荐算法》,这本书一共就4个人买过,另外三个人都买了《MarsOpinion.com鬼扯全集》,那么你很可能也会喜欢那本书。因为越大众化的爱好,越难代表一个人的特质(从而没有办法通过这个特质去寻找类似的人),而越小众的爱好,相对能更加说明者个人某方面强烈的偏好。——基本上,解决这个问题的方法很多,有一种就是在设置项量时,将值设置为该产品销量的倒数。例如你买了《哈利波特》(假设有100万人买了它),那么代表你的那个项量的《哈利波特》那个值就是百万分之一;而你如果买了《MarsOpinion.com电子商务推荐算法》,那么你相对应的那个值就是四分之一。
整个算法的复杂度是O(MN),但是因为每个客户购买的商品数量都很有限(远远小于N),所以复杂度很可能降为O(M+N),可是如果产品数量巨大的话,这个复杂度仍然是很可怕的,而相关的降低复杂度的算法(例如限制取样的客户样本大小或者商品样本大小)都会显著影响推荐结果的精度。