推荐系统之基于物品的协同过滤算法(ItemCF)

发布时间:2018-03-04 16:55,

浏览次数:1778

, 标签:

ItemCF

推荐系统之基于物品的协同过滤算法(ItemCF)

前端时间已经把基于用户的推荐系统给弄出来了,详情见我的另一篇文章:点击打开链接

,(建议先看懂UserCF后再来看这篇文章,当然大佬可以忽视)其实理解了基于用户的协同过滤算法,再来看基于物品的协同过滤算法,就会感觉没啥太大差异,

具体的思路,通俗的讲:用户A 喜欢了一个物品s集合,那么推荐的时候就把与物品s集合里最相似的前N个物品推荐给用户A,结束。

是不是言简意赅?哈哈,其实道理都差不多,看懂了UserCF再来看ItemCF,就会感觉基本差不多。具体的步骤呢:

一、计算物品之间的相似度。

二、根据物品的相似度和用户的历史行为给用户生成推荐列表

同样,计算相似度的时候公式用的也是余弦相似度,详情就看我写的UserCF吧:点击打开链接

,因为都差不多就不重复写了,对照着上一篇博客然后在看看书,就知道基本完全一样了

这里就贴上书上给的一个案例,最下面就是系统的推荐TOP N ,很好理解:

依旧是大牛的ItemCF 代码,贴上供大家学习:#-*- coding: utf-8 -*- ''' Created on 2015-06-22

@author: Lockvictor ''' import sys import random import math import os from

operator import itemgetter random.seed(0) class ItemBasedCF(object): ''' TopN

recommendation - Item Based Collaborative Filtering ''' def __init__(self):

self.trainset = {} self.testset = {} self.n_sim_movie = 20 self.n_rec_movie =

10 self.movie_sim_mat = {} self.movie_popular = {} self.movie_count = 0

print('Similar movie number = %d' % self.n_sim_movie, file=sys.stderr)

print('Recommended movie number = %d' % self.n_rec_movie, file=sys.stderr)

@staticmethod def loadfile(filename): ''' load a file, return a generator. '''

fp = open(filename, 'r') for i, line in enumerate(fp): yield line.strip('\r\n')

if i % 100000 == 0: print ('loading %s(%s)' % (filename, i), file=sys.stderr)

fp.close() print ('load %s succ' % filename, file=sys.stderr) def

generate_dataset(self, filename, pivot=0.7): ''' load rating data and split it

to training set and test set ''' trainset_len = 0 testset_len = 0 for line in

self.loadfile(filename): user, movie, rating, _ = line.split('::') # split the

data by pivot if random.random() < pivot: self.trainset.setdefault(user, {})

self.trainset[user][movie] = int(rating) trainset_len += 1 else:

self.testset.setdefault(user, {}) self.testset[user][movie] = int(rating)

testset_len += 1 print ('split training set and test set succ',

file=sys.stderr) print ('train set = %s' % trainset_len, file=sys.stderr) print

('test set = %s' % testset_len, file=sys.stderr) def calc_movie_sim(self): '''

calculate movie similarity matrix ''' print('counting movies number and

popularity...', file=sys.stderr) for user, movies in self.trainset.items(): for

movie in movies: # count item popularity if movie not in self.movie_popular:

self.movie_popular[movie] = 0 self.movie_popular[movie] += 1 print('count

movies number and popularity succ', file=sys.stderr) # save the total number of

movies self.movie_count = len(self.movie_popular) print('total movie number =

%d' % self.movie_count, file=sys.stderr) # count co-rated users between items

itemsim_mat = self.movie_sim_mat print('building co-rated users matrix...',

file=sys.stderr) for user, movies in self.trainset.items(): for m1 in movies:

for m2 in movies: if m1 == m2: continue itemsim_mat.setdefault(m1, {})

itemsim_mat[m1].setdefault(m2, 0) itemsim_mat[m1][m2] += 1 print('build

co-rated users matrix succ', file=sys.stderr) # calculate similarity matrix

print('calculating movie similarity matrix...', file=sys.stderr)

simfactor_count = 0 PRINT_STEP = 2000000 for m1, related_movies in

itemsim_mat.items(): for m2, count in related_movies.items():

itemsim_mat[m1][m2] = count / math.sqrt( self.movie_popular[m1] *

self.movie_popular[m2]) simfactor_count += 1 if simfactor_count % PRINT_STEP ==

0: print('calculating movie similarity factor(%d)' % simfactor_count,

file=sys.stderr) print('calculate movie similarity matrix(similarity factor)

succ', file=sys.stderr) print('Total similarity factor number = %d' %

simfactor_count, file=sys.stderr) def recommend(self, user): ''' Find K similar

movies and recommend N movies. ''' K = self.n_sim_movie N = self.n_rec_movie

rank = {} watched_movies = self.trainset[user] for movie, rating in

watched_movies.items(): for related_movie, similarity_factor in

sorted(self.movie_sim_mat[movie].items(), key=itemgetter(1), reverse=True)[:K]:

if related_movie in watched_movies: continue rank.setdefault(related_movie, 0)

rank[related_movie] += similarity_factor * rating # return the N best movies

return sorted(rank.items(), key=itemgetter(1), reverse=True)[:N] def

evaluate(self): ''' print evaluation result: precision, recall, coverage and

popularity ''' print('Evaluation start...', file=sys.stderr) N =

self.n_rec_movie # varables for precision and recall hit = 0 rec_count = 0

test_count = 0 # varables for coverage all_rec_movies = set() # varables for

popularity popular_sum = 0 for i, user in enumerate(self.trainset): if i % 500

== 0: print ('recommended for %d users' % i, file=sys.stderr) test_movies =

self.testset.get(user, {}) rec_movies = self.recommend(user) for movie, _ in

rec_movies: if movie in test_movies: hit += 1 all_rec_movies.add(movie)

popular_sum += math.log(1 + self.movie_popular[movie]) rec_count += N

test_count += len(test_movies) precision = hit / (1.0 * rec_count) recall = hit

/ (1.0 * test_count) coverage = len(all_rec_movies) / (1.0 * self.movie_count)

popularity = popular_sum / (1.0 * rec_count) print

('precision=%.4f\trecall=%.4f\tcoverage=%.4f\tpopularity=%.4f' % (precision,

recall, coverage, popularity), file=sys.stderr) if __name__ == '__main__':

ratingfile = os.path.join('ml-1m', 'ratings.dat') itemcf = ItemBasedCF()

itemcf.generate_dataset(ratingfile) itemcf.calc_movie_sim() itemcf.evaluate()

代码来源:https://github.com/Lockvictor/MovieLens-RecSys

推荐算法 itemcf java_推荐系统之基于物品的协同过滤算法(ItemCF)相关推荐

  1. 【推荐系统】基于物品的协同过滤算法

    基于物品的协同过滤算法 目前业界应用最多的算法. 给用户推荐和他们之前喜欢的物品相似的物品. 其主要通过分析用户的行为记录计算物品之间的相似度.物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都 ...

  2. [推荐算法]ItemCF,基于物品的协同过滤算法

     [推荐算法]ItemCF,基于物品的协同过滤算法 标签: ItemCF基于用户的协同过滤算法 2015-03-09 15:11 4144人阅读 评论(1) 收藏 举报 本文章已收录于: 分类: ...

  3. 【推荐系统】{2} —— 基于物品的协同过滤算法

    协同过滤(英语:Collaborative Filtering,简称CF),简单来说是利用某兴趣相投.拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人透过合作的机制给予信息相当程度的回应(如评分) ...

  4. 推荐算法概述(基于用户的协同过滤算法、基于物品的协同过滤算法、基于内容的推荐算法)

    "无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点这里可以跳转到教程." 目前推 ...

  5. 推荐系统实战(2)——基于物品的协同过滤算法(代码实现),U-CF和I-CF的比较

    这里加点东西:有利于理解 1基于CF的推荐算法 1.1算法简介 CF(协同过滤)简单来形容就是利用兴趣相投的原理进行推荐,协同过滤主要分两类,一类是基于物品的协同过滤算法,另一种是基于用户的协同过滤算 ...

  6. 推荐系统实践(二)----基于物品的协同过滤算法(ItemCF)

      上一篇博客我简单讲了一下基于用户的协同过滤算法,这里我们一起来学习一下另一种:基于物品的协同过滤算法.基于物品的协同过滤算法是目前业界应用最多的算法,亚马逊.Netflix.Hulu.YouTub ...

  7. 基于物品的协同过滤推荐算法_《推荐系统实践》3.基于物品的协同过滤算法

    基于物品的协同过滤算法(item-based collaborative filtering,以下简称ItemCF)算法思想:给用户推荐那些和他们之前喜欢的物品相似的物品. 不过,ItemCF算法并不 ...

  8. ItemCF,基于物品的协同过滤算法

    转载自   ItemCF,基于物品的协同过滤算法 ItemCF:Item Collaboration Filter,基于物品的协同过滤 算法核心思想:给用户推荐那些和他们之前喜欢的物品相似的物品. 比 ...

  9. 基于物品的协同过滤算法ItemCF

    基于物品的协同过滤算法ItemCF 基于item的协同过滤,通过用户对不同item的评分来评测item之间的相似性,基于item之间的相似性做出推荐.简单来讲就是:给用户推荐和他之前喜欢的物品相似的物 ...

最新文章

  1. mysql 数据目录更改
  2. SAP WM中阶下架策略A(Partial Pallet Quantity)
  3. UVa572 Oil Deposits DFS求连通块
  4. leetcode_894. All Possible Full Binary Trees
  5. 什么是服务质量(QoS) ?—Vecloud微云
  6. 申明   csdn的博客wjszf 也是本人的
  7. 自考教育学计算机实践考试,中山大学自考计算机实践考试的流程是什么?
  8. 小程序进入页面图片渲染会拉伸闪下变形优化bug
  9. java 运行scala_使用java命令运行scala代码
  10. ArcGIS学习总结(五)——地形分析-TIN及DEM的生成
  11. mysql所有版本介绍_MySQL各版本介绍
  12. ASP.NET MVC 5高级编程 (pdf书)
  13. 求最大公约数的4种常用算法
  14. 计算机电源插座安装,弱电箱里的插座 介绍及安装方法
  15. 一个IP可以登几个拼多多后台 拼多多如何推广营销
  16. C# 调用FFmpeg处理音视频的示例
  17. java map 队列_JavaSE-List/Map/Queue
  18. 投行 SQL 人的 2018 年终回顾
  19. win10桌面计算机怎么显示器,一台电脑两个显示器如何设置
  20. 评自主创新与自主实现

热门文章

  1. jzoj4270 [NOIP2015模拟10.27]魔道研究 线段树
  2. 微信怎么连接服务器配置,对接微信,配置通用链接
  3. 撞击测试软件,哪些BIM软件有碰撞检测功能?这两款是常客
  4. 免费开源训练营又来啦!这次一起做个“机器人”
  5. SU插件情报局 | JPP联合推拉4.3 可视互动版(附插件获取)
  6. 对于上千万甚至上亿的数据,如何正确的删除?
  7. 【小游戏:顺序击破格子】egret引擎实战(一)
  8. 我踩过的坑(二)替换Oracle字段中的字符
  9. 2012盘点“孔子”周润发的经典语录年度经典语录励志天
  10. g++/gcc编译过程中遇到的问题