浅入浅出:PageRank算法 使用 TextRank 算法为文本生成关键字和摘要 基于物品的协同过滤 如何使用MapReduce实现基于物品的协同过滤(1) 如何使用MapReduce实现基于物品的协同过滤(2) 浅入浅出:K近邻算法 使用mahout下的朴素贝叶斯分类器对新闻分类 使用Affinity Propagation进行聚类 K-medoids聚类 矩阵分解在推荐系统中的应用:NMF和经典SVD实战 使用特征递归消除筛选特征 如何分配权重 比较NMF、PCA和VQ 方差和协方差 基于SVD的协同过滤 逻辑斯谛回归代码实现 隐语义模型和NMF(非负矩阵分解) 使用PCA处理MNIST数据集 使用GBDT选取特征 基于贝叶斯的文本分类系统的数据库设计 在hadoop1.2.1上安装mahout 0.9 Hadoop 2.4 实现Kmeans聚类算法 在Iris数据集上对比PCA、LDA、NMF 基于贝叶斯的文本分类实战 单层决策树 Logistic regression(逻辑斯蒂回归) 基于用户的协同过滤 词袋模型与文档-词矩阵 如何实现拼音与汉字的互相转换 梯度下降法 如何判定相似度 MovieLens数据集介绍 基于KNN的文本分类实战 Jasper文本分类系列博客阅读摘录 使用 Mean Shift进行聚类 朴素贝叶斯的三个常用模型:高斯、多项式、伯努利 使用决策树处理iris数据集 浅入浅出:从Kmeans到Kmeans++ 如何持久化scikit-learn中训练好的模型 浅入浅出:DBSCAN聚类算法(1) 浅入浅出:DBSCAN聚类算法(2) 2015阿里移动推荐算法比赛第一赛季总结 爬山算法 使用朴素贝叶斯分类器划分邮件 层次聚类 基于MapReduce的频繁项集挖掘 搜狗实体关系提取比赛

基于物品的协同过滤


#机器学习


2014-03-27

基于用户的协同过滤中已经简单的介绍了协同过滤的思想,在实际应用中还有一种叫做基于物品的协同过滤(Item CF)。

计算书籍之间的相似性

基于用户的协同过滤 文中提到下面的表:

用户 book01 book02 book03 book04
user1 2 4.5 4.5 3
user2 2.5 4.0 4.5 3
user3 4 3 3 4

上表表示user1、user2、user3分别对book01、book02、book03和book04的评价。将上面的表转置,在多加几条数据,则变为:

书籍 user1 user2 user3
book01 2 2.5 4
book02 4.5 4.0 3
book03 4.5 4.5 3
book04 3 3 4
book05 2.5 2 2.5
book06 3 4 3.5

由上表我们可以判断每本书之间的相似性:

from math import sqrt
def get_euclidean_similarity(dot1, dot2):
    ''' 根据欧几里得距离判断相似性'''
    s = sum([pow(dot1[x] - dot2[x], 2) for x in range(len(dot1))])
    return 1.0 / (1.0 + sqrt(s))

if __name__ == '__main__':
    books = {'book01': [2, 2.5, 4],
             'book02':[4.5, 4.0 ,3],
             'book03':[4.5, 4.5, 3],
             'book04':[3, 3, 4],
             'book05':[2.5, 2, 2.5],
             'book06':[3, 4, 3.5]
             }
    book_names =  books.keys()
    book_num = len(book_names)
    groups = [[book_names[x1],book_names[x2]] for x1 in xrange(book_num) for x2 in xrange(book_num) if x1 < x2 ]
    for group in groups:
        print group[0]+'~'+group[1], get_euclidean_similarity(books[group[0]], books[group[1]])

计算结果如下:

书~书 相似性
book01~book03 0.229668484512
book01~book02 0.244965529586
book01~book05 0.37617851153
book01~book04 0.472135955
book01~book06 0.348331477355
book03~book02 0.666666666667
book03~book05 0.235828457811
book03~book04 0.298935084425
book03~book06 0.37617851153
book02~book05 0.258245699761
book02~book04 0.32663163471
book02~book06 0.387425886723
book05~book04 0.348331477355
book05~book06 0.303832434701
book04~book06 0.472135955

由上表可见,很容易看出book02和book03最为相似。由上面的结果,已经可以做一个简单的推荐了,例如如果用户读了book01,那么可以向其推荐book04,因为这两本书相似性很大。

不过,一般是仍然使用加权平均向用户推荐。

向用户推荐书籍

假设用户user4读过book01和book02,对两本书的评价如下:

book01 book02
3.5 4.5

下面试着计算应该向用户user4推荐book03、book04、book05、book06中的哪一本。

book01与book03之间的相似度为0.229668484512,book02与book03之间的相似度为0.666666666667,所以book03的推荐值为:

( 3.5*0.229668484512 + 4.5*0.666666666667 ) / (0.229668484512 + 0.666666666667)
 = 4.243769410125326

同理,book04的推荐值为:

( 3.5*0.472135955 + 4.5*0.32663163471 ) / (0.472135955 + 0.32663163471)
 = 3.908919489120217

book05的推荐值为:

( 3.5*0.37617851153  +  4.5*0.258245699761 ) / (0.37617851153 + 0.258245699761)
 =  3.9070552402713186

book06的推荐值为:

( 3.5*0.348331477355  +  4.5*0.387425886723  ) / (0.348331477355 + 0.387425886723)
 = 4.026567460467752

由上面的计算可得,这四本书的推荐程度由大到小依次为:`book03 -> book06 -> book04 -> book05。



( 本文完 )