首页 > 代码库 > 数据挖掘算法修炼--协同过滤Collaborative Filtering

数据挖掘算法修炼--协同过滤Collaborative Filtering

从外部看协同过滤

   从互联网上寻找有用的信息越来越难,这催生了三类方法:信息检索、信息过滤和推荐系统。信息检索是指Google、百度这样的搜索引擎,这是一种被动的方式;信息过滤是指先对信息进行分类,再根据用户的偏好进行过滤,比如我们注册知乎/豆瓣/微博等时都会要求选择感兴趣的领域,之后会对我们选定领域的内容进行推送;推荐系统根据用户的兴趣特点和购买行为,向用户推荐用户感兴趣的信息和商品,推荐方法有基于内容的推荐、基于模型的推荐、关联规则以及协同过滤等等。

 

从内部看协同过滤

核心思想

协同过滤算法的两个假设:

1.      用户一般会喜欢与自己相似的其他用户喜欢的物品

2.      用户一般会喜欢与自己喜欢物品相似的物品

 

Two Classic Algorithms

1. User-based CF

基于用户的协同过滤的核心思想是把推荐分两步:

第一步,找到和你品位喜好相似的人;

第二步,把他们的喜欢的东西整理成排序列表推荐给你

Inputs:

l  user-item matrix  #M X N

l  similarity="Euclidean_distance", "Cosine", "Pearson", "Adjust_cosine"  #相似性计算方式

l  K or threshold   #fix-size neighborhoods or threshold neighborhoods,或者使用优化算法自动选择

l  type="predict" or "recommend"  # 预测评分还是推荐商品

l  top-n  #推荐top-n商品

l  UID #需要做推荐的用户ID

Outputs:

l  type="recommend", 为用户UID推荐的top-n个商品

l  type="predict", 用户UID对 item的评分预测

 

Setp1:Calculate similarity( i , UID )

这里只计算特定用户UID和其他M-1个用户的相似性;也可以先计算M个用户之间的相似性—>MXM相似性矩阵,然后取UID那一行。

此处计算相似性分两种:

计算用户i和UID在all_items集合上的相似性

计算用户i和UID在共同评分过的items集合上的相似性(user-item不能是0-1矩阵,多用在评分预测中)

output1 : 此步得到的是一个vector or list(1 X M-1)

 

Step2:K-nearest-neighborhoods

l  fixed K:降序排列,取前K个uid

l  threshold:取similarity大于等于threshold的uid

注:K和threshold的选择可使用Cross-Validation优化

output2 : 这一步我们得到一个verctor( 1 X F )

 

Step3:Predict or Recommend

上一步我们得到和当前用户UID最相似的K个用户,这K个用户历史购买记录我们记为KNNSet_i(i=1,2,...,K)。

type="Recommend"

推荐主要针对user_item是0-1矩阵的情况,就是把邻居喜欢并且当前用户没有购买的物品推荐给用户。这里实现起来有两种方法,

第一种较简单,不考相似度,想法是这样的:把K个最近邻最经常购买过的物品推荐给当前用户。具体这样操作:

从原始User-Item matrix中提取KNNSet_i得到KNN-User-Item matrix(K X N)—>按列求和得到N个item的购买频率FV(1 X N)—>剔除当前用户已经购买的item—>按频率降序排列,取前n个item做推荐;

第二种思路上和第一种一致,只不过购买频率的计算考虑相似度,即加权的购买频率。在按列求和之前,需要在KNN-User-Item matrix的每一行乘以相应的相似度,其余步骤相同。

Type=”predict”

预测针对user_item是评分的情况,预测当前用户对某一个物品(电影\音乐\文章)的评分,思路依然是计算加权平均分。

(得到预测评分之后可以再进一步,对p(uid,i)降序排列,取前n个做推荐,这时候type=‘recommend‘)

 

2.  Item-based CF

基于物品的协同过滤算法的核心思想也是把推荐分两步:

第一步,找到和你历史购买物品相似的物品

第二步,把这些物品整理成排序列表推荐给你

User_Item matrix是0-1矩阵(Amazom item-item)

Step1 : calculate similarity ( I1 , I2 )

  • 为节省计算资源,先找出有共同顾客的商品对,排除大部分没有任何交集的商品

For each item in product catalog, I1

   For each customer C who purchased I1 

      For each item I2 purchased bycustomer C

         Record that a customer purchased I1 and I2

   For each item I2
      Compute the similarity between I1 and I2

  • 相似度计算

所有的用户都参与计算,而不仅仅是I1,I2都购买过的那些用户(在此情况下,这么计算没意义)。

 

Step2 : recommend

假设用户UID最近购买了商品I—>利用item-item-similarity矩阵找出商品I最相似的K个商品—>剔除已购买的—>取前n个推荐

 

User_Item matrix是rating矩阵

Step1 : calculate similarity ( i , j )

这里计算相似度有所不同,只利用对item_i,item_j共同评价过的用户计算相似度。

 

这一步得到N X N的item-item-similarity矩阵

 

Step2 : predict

?????

 

Variants

1. Slope one

核心思想:用函数f(x)=x+b代替加权分,The free parameter b is then simply the average differencebetween the two items ratings.

HOW:

l  找出( item_T,item_i )之间的评分均差bi和共同评分的用户数ni

2. 时间权重

核心思想:传统协同过滤算法没有考虑用户兴趣变化的问题,当用户兴趣发生变化时将导致它的推荐质量较差。

HOW:

l  设计时间权重函数f(t)

l  用f(t)赋予每个评分一个时间权重

l  利用时间加权后的评分计算相似性,其他相同

3. 热门物品

核心思想:越是冷门的物品有同样的行为,就越能说明用户间的相似性,在计算用户相似性的时候需要降低热门物品的影响。

HOW:设计流行度权重1/N(i)。

4. 基于高分纪录

核心思想:推荐算法的目的多数情况下是为用户推荐他们最感兴趣的项,尝试找到在用户最感兴趣的领域中最相似的其他用户。

HOW:在相似性计算中只考虑那些高评价的记录,比如高于用户rating平均分的记录

 

数据挖掘算法修炼--协同过滤Collaborative Filtering