基于用户的协同过滤算法(UserCF)

本文介绍了一种基于用户的协同过滤推荐算法实现。该算法通过计算用户间的相似度来预测目标用户可能感兴趣的物品,并给出了具体实现步骤及核心代码。

基于用户的协同过滤算法:

  1. 找到和目标用户相似的用户集合
  2. 找到这个集合中用户喜欢的但目标用户没有听过的物品
#encoding: utf-8
from Similarity import Person
from Sort import select_sort


file=open('user_bookmark','r')
filew=open('user_bookRecommend','w')

#加载训练集
trainSet={}
while True:
    line=file.readline().strip()
    if not line: break
    userId,itemId=line.split("::")
    trainSet.setdefault(userId,[])
    trainSet[userId].append(itemId)

# 计算每个用户和其他所有用户的相似度,排序,获得相似度最高的前N个用户, 
# 在计算每个用户的相似度*物品的偏好值(这里没有评分就把偏好值设置为1)

for v in trainSet.keys():
    v2u={}
    K={}
    for u in trainSet.keys():
       if u!=v:
          sim=Person(trainSet[v],trainSet[u])
          v2u.setdefault(u,sim)
    keys,values=select_sort(v2u)

    s=v
    for i in range(len(values)-3,len(values)):
       s=s+"::"+keys[i]+" "+str(values[i])
       K.setdefault(keys[i],values[i])

    rank={}
    rki=1
    interacted_items=trainSet[v]
    for k,simk in K.items():
        for i in trainSet[k]:
            if i in interacted_items:
                continue
            rvi=rki*simk
            rank.setdefault(i,rvi)
    s1=v
    _keys,_values=select_sort(rank)
    for i in range(len(rank)-6,len(rank)):
         #s1=s1+_keys[i]+" "+str(_values[i])+"::"
         s1=s1+"::"+_keys[i]
    print s1
    filew.write(s1+'\n')


from math import sqrt



def Person(item_a,item_b):
    if len(item_a)==0 or len(item_b)==0:
        return 0;
    else:
        sum=0
        for i in range(len(item_a)):
            for j in range(len(item_b)):
                if item_a[i]==item_b[j]:
                    sum=sum+1
        if sum==0:
            return 0
        else:
            sim=sum/sqrt(len(item_a)*len(item_b))
            return sim

  

转载于:https://www.cnblogs.com/zzblee/p/4189279.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值