推荐系统--基于用户的协同过滤算法

1.         概述 python

和搜索引擎同样,推荐系统是为了帮助人们更快速的得到对本身有用的信息。 算法

和搜索引擎不一样,推荐系统是人们被动的获取,由系统根据用户行为或其余的信息推荐给用户的,儿搜索引擎是用户主动输入关键字获取的。 网络

从某种意义上说,搜索引擎和推荐系统是互相补充的。 优化

而推荐算法的本质是经过必定的方式将用户和物品联系起来,从而有效的给用户推荐自己感兴趣或须要可是没有发现的物品。 网站

个性化推荐系统的应用场景:电子商务(听说Amazon 35%的销售额来自推荐系统)、电影和视频网站、个性化音乐网络电台、社交网络、个性化阅读、基于位置的服务、个性化邮件、个性化广告(上下文广告、搜索广告、个性化展现广告)。 搜索引擎

 

         一个推荐系统的评判标准:用户满意度、预测准确度、覆盖率、多样性、新颖性、惊喜度、信任度、实时性、健壮性、商业目标。 code

2.        主要推荐系统算法 视频

基于邻域的方法、隐语义模型、基于图的随机游走算法。在这些方法中,最著名、在业界获得最普遍应用的算法是基于邻域的方法。 索引

基于邻域的方法主要包括:基于用户的协同过滤算法(给用户推荐和他兴趣类似的其余用户喜欢的物品)和基于物品的协同过滤算法(给用户推荐和该用户喜欢的物品属性相似的其余物品) utf-8

下面主要说明一下第一种算法

基于用户的协同过滤算法

该算法的主要步骤:一、找到与该用户兴趣类似的用户集;二、找到这个集合中的用户喜欢的可是没有据说过的物品推荐给目标用户。

第一步:计算用户的兴趣类似度

能够经过如下公式计算:

其中u,v表示两个用户,N(u)表示用户u曾经有过正反馈的物品集合;N(v)表示用户v曾经有过正反馈的物品集合。

算法的Python实现以下:


def User_Similarity(train):
    W=dict()
    for u in train.keys():
        for v in train.keys():
            if u == v: 
                continue;      
            W[u][v] = len(train[u],train[v])
            W[u][v] /= math.sqrt(len(train[u]) * len(train[v]) * 1.0)



能够发现该代码的时间复杂度是O(n*n),而且大多数用户的兴趣类似度可能位0,即|N(u)∩N(v)| = 0,因此该代码仍是能够优化的。

咱们能够先计算出|N(u)∩N(v)| ≠ 0的用户对(u,v)而后除以余弦类似度。这里可使用倒排,将数据排列成物品到用户的倒排表,物品后连接的是与对该物品感兴趣的用户链表,而后循环统计每一个物品用户链表的用户类似度便可。

算法的Python代码以下:

#!/usr/bin/env python
# coding=utf-8
def UserSimilarity(train):
    #创建倒排表
    item_users = dict()
    for u,items in train.items():
        for i in item.keys():
            if i not in item_users:
                items_users[i] = set()
            item_users[i].add(u)
    #item_users即为物品到用户的倒排表
    #计算用户之间的相关度
    C = dict()#任意用户之间的相关度
    N = dict()#用户正反馈物品的数目
    for i ,users in item_users:
        for u in users:
            N[u] += 1
            for v in users:
                if u == v:
                    continue:
                C[u][v] += 1
    #最后计算结果矩阵
    W = dict()
    for u ,related_users in C.items():
        for v,cuv in related_users:
            W[u][v] = cuv / math.sqrt(N[u]* N[v]*1.0)
return W



 

 

物品-用户倒排表

第二步:推荐和他类似的K个用户喜欢的物品

其中:p(u,i)用户u对物品i的兴趣度;

S(u,K)包含和用户u兴趣最相近的K的用户;

Wuv用户u和用户v的兴趣类似度;

Rvi用户v对物品i的兴趣度;

 

算法的Python代码实现:

def Recommend(user,train,W):
    rank = dict()
    interacted_items = train[user]
    for v , wuv in sort(W[u].items,key = itemgetter(1),reverse = True)[0:k]:
        for i ,rvi in train[v].items:
            if i in interacted_items:
                continue
            rank[i] += wuv * rvi
    return rank
相关文章
相关标签/搜索