首页 > 代码库 > 基于用户的协同过滤算法(UserCF)
基于用户的协同过滤算法(UserCF)
基于用户的协同过滤算法:
- 找到和目标用户相似的用户集合
- 找到这个集合中用户喜欢的但目标用户没有听过的物品
#encoding: utf-8from Similarity import Personfrom Sort import select_sortfile=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 sqrtdef 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
基于用户的协同过滤算法(UserCF)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。