1推荐算法导论

个性化推荐算法前导课程

推荐系统的背景与工业界推荐系统的架构

  1. 什么是推荐系统
    帮助人们从海量的信息中选择感兴趣的信息

  2. 如何评价一个好的推荐系统

    • 物品丰富:才能满足不同用户的需求
    • 推荐精准:用户能够愉悦的找需要的信息
  3. 工业界主流的落地场景

    • 信息流:如今日头条,腾讯新闻等
    • 电商产品:淘宝移动端
    • o2o的LBS

个性化召回算法的介绍(协同过滤)

  1. 基于物品的协同过滤(Itemcf)
    给用户推荐他之前喜欢物品的相似物品

  2. 基于用户的协同过滤(Usercf)

    • 给用户推荐相似兴趣用户感兴趣的物品
    • 如何评价相似兴趣用户集合? 用户的行为具有很多重合部分
      如下图所示,A,D两个用户有相同的项目a,d,那么我们可以根据A的项目向
      D用户推荐项目b

1推荐算法导论_第1张图片
3. Itemcf与Usercf的优缺点分析

  • 推荐实时性
    对于usercf来说,当用户有了新的行为时,推荐结果并不能很快的发生变化。但是对于itemcf来说,用户一旦有了新的行为,推荐会立马变化
  • 新用户/新物品的推荐
    对于usercf,新用户不能得到推荐,需要用户有一定的行为,然后计算新用户与其他用户的相似度完成推荐;新物品入库后一旦被用户点击,就可以被推荐给相似用户。
    对于itemcf,新用户一旦完成item点击,便可以推荐和该item相似的其它item;新物品入库后,由于没有和该物品相似的物品,所以不能及时的将该物品推荐出去
  • 推荐理由的相似性
    usercf由于是基于用户相似度矩阵来完成推荐的,所以几个很难具有解释性
    itemcf是基于用户历史点击进行推荐的

usercf与itemcf代码实战

  1. 抽取信息函数的编写(reader.py)
    包含两个文件rating_file(评分文件) 和 item_file(电影信息文件)
    需要从包含用户id(userid), 电影id(movie), 评分(rating), 时间戳(timestamp) 四个属性的rating_file文件中筛选出对电影评分大于3 的用户信息

    def get_user_click(rating_file):  
    	if not os.path.exists(rating_file): #判断文件是否为空
    		return{}
    fp = open(rating_file)
    num = 0
    user_click = {}
    for line in fp:
    	if num == 0:   #文件的第一行不是数据行,所以定义一个计数器来屏蔽第一行
    		num += 1
    		continue
    	item = line.strip().split(',')  #将每一行按','切割
    	if len(item) < 4:    #item小于4 说明数据有丢失
    		continue
    	[userid,itemid,rating,timestamp] = item
    	if float(rating) < 3.0:    #评分大于等于3分(5分制),表示用户喜欢这个item
    		continue
    	if userid not in user_click:
    		user_click[userid] = []
    	user_click[userid].append(itemid)
    fp.close()
    return user_click
    

下面写关于得到电影信息的函数

	def grt_item_info(item_file):
		if not so.path.exists(item_file):
			return{}
		num = 0
		item_info = {}
		fp = open(item_file)
		for line in fp:
			if num == 0
				continue
			item = line.strip().split(',')
			if len(item) < 3:
				continue
			if len(item) == 3:   #由于有的电影名字中间也有"," 所以需要将","数大于3的情况进行处理
				[itemid,title,genres] = item
			elif len(item) > 3:
				itemid = item[0]
				geners = item[-1]
				title = ",".join(item[1:-1])
			if itemid not in item_info:
				item_info[itemid] = [title,genres]
		fp.close()
		return item_info
  1. itemcf基础部分代码实战
	import reader as reader

	def base_contribute_score():
		return 1
		
	def cal_item_sim(user_click):
	"""
		参数是字典,userid : [itemid1,itemid2,...]
	"""
		co_appear = {}
		item_user_click_time = {}
		for user,itemlist in user_click.items():
			for index_i in range(0,len(itemlist)):
				itemid_i = itemlist[index_i]
				item_user_click_time.setdefault(itemid_i,0)  #设定初始值
				item_user_click_time[itemid_i] += 1
				for index_j in range(index_i+1,len(itemlist)):
					itemid_j = itemlist[index_j]
					co_appear.setdefault(itemid_i,{})
					co_appear[itemid_i].setdefault(itemid_j,0)
					co_appear[itemid_i][itemid_j] += base_contribute_score()
					
					co_appear.setdefault(itemid_j,{})
					co_appear[itemid_j].setdefault(itemid_i,0)
					co_appear[itemid_j][itemid_i] += base_contribute_score()
					
		item_sim_score = {}
		for itemid_i,relate_item in co_appear.items():
			for itemid_j,co_time in relate_item.items():
				sim_score = co_time/math.sqrt(item_user_click_time[itemid_i],item_user_time[itemid_j])
				item_sim_score.setdefault(itemid_i,{})
				item_sim_score[itemid_i].setdefault(itemid_j,0)
				item_sim_score[itemid_i][itemid_j] = sim_score
		return item_sim_score
		
	def main_flow():
		user_click = reader.get_user_click("ratings.txt")  #获取用户的点击序列
		sim_info = cal_item_sim(user_click)  #根据用户的点击序列得到item的相似度
		recom_result = cal_recom_result(sim_info,user_click)   #计算推荐结果
	 	

你可能感兴趣的:(推荐算法,推荐算法导论,慕课,python,个性化推荐)