python做的网站有什么漏洞,重庆微信网站作公司,长沙设备建站按效果付费,大数据对网站建设教育的影响[机器学习]推荐系统之协同过滤算法 在现今的推荐技术和算法中#xff0c;最被大家广泛认可和采用的就是基于协同过滤的推荐方法。本文将带你深入了解协同过滤的秘密。下面直接进入正题. 1. 什么是推荐算法 推荐算法最早在1992年就提出来了#xff0c;但是火起来实际上是最近这…[机器学习]推荐系统之协同过滤算法 在现今的推荐技术和算法中最被大家广泛认可和采用的就是基于协同过滤的推荐方法。本文将带你深入了解协同过滤的秘密。下面直接进入正题. 1. 什么是推荐算法 推荐算法最早在1992年就提出来了但是火起来实际上是最近这些年的事情因为互联网的爆发有了更大的数据量可以供我们使用推荐算法才有了很大的用武之地。 最开始所以我们在网上找资料都是进yahoo然后分门别类的点进去找到你想要的东西这是一个人工过程到后来我们用google直接搜索自己需要的内容这些都可以比较精准的找到你想要的东西但是如果我自己都不知道自己要找什么肿么办最典型的例子就是如果我打开豆瓣找电影或者我去买说我实际上不知道我想要买什么或者看什么这时候推荐系统就可以派上用场了。 2. 推荐算法的条件 现在的各种各样的推荐算法但是不管怎么样都绕不开几个条件这是推荐的基本条件 1.根据和你共同喜好的人来给你推荐 2.根据你喜欢的物品找出和它相似的来给你推荐 3.根据你给出的关键字来给你推荐这实际上就退化成搜索算法了 4.根据上面的几种条件组合起来给你推荐 3. 推荐算法分类 推荐算法大致可以分为三类 3.1 基于内容的推荐算法 基于内容的推荐算法原理是用户喜欢和自己关注过的Item在内容上类似的Item比如你看了哈利波特I基于内容的推荐算法发现哈利波特II-VI与你以前观看的在内容上面共有很多关键词有很大关联性就把后者推荐给你这种方法可以避免Item的冷启动问题冷启动如果一个Item从没有被关注过其他推荐算法则很少会去推荐但是基于内容的推荐算法可以分析Item之间的关系实现推荐弊端在于推荐的Item可能会重复典型的就是新闻推荐如果你看了一则关于MH370的新闻很可能推荐的新闻和你浏览过的内容一致另外一个弊端则是对于一些多媒体的推荐比如音乐、电影、图片等)由于很难提内容特征则很难进行推荐一种解决方式则是人工给这些Item打标签。 3.2 协同过滤推荐算法 协同过滤算法原理是用户喜欢那些具有相似兴趣的用户喜欢过的商品比如你的朋友喜欢电影哈利波特I那么就会推荐给你这是最简单的基于用户的协同过滤算法user-based collaboratIve filtering还有一种是基于Item的协同过滤算法item-based collaborative filtering这两种方法都是将用户的所有数据读入到内存中进行运算的因此成为Memory-based Collaborative Filtering另一种则是Model-based collaborative filtering包括Aspect ModelpLSALDA聚类SVDMatrix Factorization等这种方法训练过程比较长但是训练完成后推荐过程比较快。 3.3基于知识的推荐算法。 最后一种方法是基于知识的推荐算法也有人将这种方法归为基于内容的推荐这种方法比较典型的是构建领域本体或者是建立一定的规则进行推荐。 混合推荐算法则会融合以上方法以加权或者串联、并联等方式尽心融合。 当然推荐系统还包括很多方法其实机器学习或者数据挖掘里面的方法很多都可以应用在推荐系统中比如说LR、GBDT、RF这三种方法在一些电商推荐里面经常用到社交网络里面的图结构等都可以说是推荐方法。 今天这篇文章要讲的基于用户的协同过滤算法. 3 什么是协同过滤 协同过滤是利用集体智慧的一个典型方法。要理解什么是协同过滤 (Collaborative Filtering, 简称 CF)首先想一个简单的问题如果你现在想看个电影但你不知道具体看哪部你会怎么做大部分的人会问问周围的朋友看看最近有什么好看的电影推荐而我们一般更倾向于从口味比较类似的朋友那里得到推荐。这就是协同过滤的核心思想。 换句话说就是借鉴和你相关人群的观点来进行推荐很好理解。 4 协同过滤的实现 要实现协同过滤的推荐算法要进行以下三个步骤 4.1)收集数据 4.2)找到相似用户和物品 4.3进行推荐 4.1 收集数据 这里的数据指的都是用户的历史行为数据比如用户的购买历史关注收藏行为或者发表了某些评论给某个物品打了多少分等等这些都可以用来作为数据供推荐算法使用服务于推荐算法。需要特别指出的在于不同的数据准确性不同粒度也不同在使用时需要考虑到噪音所带来的影响。 4.2找到相似用户和物品 这一步也很简单其实就是计算用户间以及物品间的相似度。以下是几种计算相似度的方法 4.3 进行推荐 在知道了如何计算相似度后就可以进行推荐了。 在协同过滤中有两种主流方法 1)基于用户的协同过滤 2)基于物品的协同过滤 具体怎么来阐述他们的原理呢看个图大家就明白了 基于用户的 CF 的基本思想相当简单基于用户对物品的偏好找到相邻邻居用户然后将邻居用户喜欢的推荐给当前用户。计算上就是将一个用户对所有物品的偏好作为一个向量来计算用户之间的相似度找到 K 邻居后根据邻居的相似度权重以及他们对物品的偏好预测当前用户没有偏好的未涉及物品计算得到一个排序的物品列表作为推荐。 下图给出了一个例子对于用户 A根据用户的历史偏好这里只计算得到一个邻居 - 用户 C然后将用户 C 喜欢的物品 D 推荐给用户 A。 基于物品的 CF 的原理和基于用户的 CF 类似只是在计算邻居时采用物品本身而不是从用户的角度即基于用户对物品的偏好找到相似的物品然后根据用户的历史偏好推荐相似的物品给他。从计算的角度看就是将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度得到物品的相似物品后根据用户历史的偏好预测当前用户还没有表示偏好的物品计算得到一个排序的物品列表作为推荐。下图给出了一个例子对于物品 A根据所有用户的历史偏好喜欢物品 A 的用户都喜欢物品 C得出物品 A 和物品 C 比较相似而用户 C 喜欢物品 A那么可以推断出用户 C 可能也喜欢物品 C。 算法存在的问题 这个算法实现起来也比较简单但是在实际应用中有时候也会有问题的。 比如一些非常流行的商品可能很多人都喜欢这种商品推荐给你就没什么意义了所以计算的时候需要对这种商品加一个权重或者把这种商品完全去掉也行。 再有对于一些通用的东西比如买书的时候的工具书如现代汉语词典新华字典神马的通用性太强了推荐也没什么必要了。 适用场景 在非社交网络的网站中内容内在的联系是很重要的推荐原则它比基于相似用户的推荐原则更加有效。比如在购书网站上当你看一本书的时候推荐引擎会给你推荐相关的书籍这个推荐的重要性远远超过了网站首页对该用户的综合推荐。可以看到在这种情况下Item CF 的推荐成为了引导用户浏览的重要手段。同时 Item CF 便于为推荐做出解释在一个非社交网络的网站中给某个用户推荐一本书同时给出的解释是某某和你有相似兴趣的人也看了这本书这很难让用户信服因为用户可能根本不认识那个人但如果解释说是因为这本书和你以前看的某本书相似用户可能就觉得合理而采纳了此推荐。 具体实现 # -*- codingutf-8 -*-import math
import sys
from texttable import Texttable # # 使用 |AB|/sqrt(|A || B |)计算余弦距离 # # # def calcCosDistSpe(user1,user2): avg_x0.0 avg_y0.0 for key in user1: avg_xkey[1] avg_xavg_x/len(user1) for key in user2: avg_ykey[1] avg_yavg_y/len(user2) u1_u20.0 for key1 in user1: for key2 in user2: if key1[1] avg_x and key2[1]avg_y and key1[0]key2[0]: u1_u21 u1u2len(user1)*len(user2)*1.0 sx_syu1_u2/math.sqrt(u1u2) return sx_sy # # 计算余弦距离 # # def calcCosDist(user1,user2): sum_x0.0 sum_y0.0 sum_xy0.0 for key1 in user1: for key2 in user2: if key1[0]key2[0] : sum_xykey1[1]*key2[1] sum_ykey2[1]*key2[1] sum_xkey1[1]*key1[1] if sum_xy 0.0 : return 0 sx_symath.sqrt(sum_x*sum_y) return sum_xy/sx_sy # # # 相似余弦距离 # # # def calcSimlaryCosDist(user1,user2): sum_x0.0 sum_y0.0 sum_xy0.0 avg_x0.0 avg_y0.0 for key in user1: avg_xkey[1] avg_xavg_x/len(user1) for key in user2: avg_ykey[1] avg_yavg_y/len(user2) for key1 in user1: for key2 in user2: if key1[0]key2[0] : sum_xy(key1[1]-avg_x)*(key2[1]-avg_y) sum_y(key2[1]-avg_y)*(key2[1]-avg_y) sum_x(key1[1]-avg_x)*(key1[1]-avg_x) if sum_xy 0.0 : return 0 sx_symath.sqrt(sum_x*sum_y) return sum_xy/sx_sy # # 读取文件 # # def readFile(file_name): contents_lines[] fopen(file_name,r) contents_linesf.readlines() f.close() return contents_lines # # 解压rating信息格式用户id\t硬盘id\t用户rating\t时间 # 输入数据集合 # 输出:已经解压的排名信息 # def getRatingInformation(ratings): rates[] for line in ratings: rateline.split(\t) rates.append([int(rate[0]),int(rate[1]),int(rate[2])]) return rates # # 生成用户评分的数据结构 # # 输入:所以数据 [[2,1,5],[2,4,2]...] # 输出:1.用户打分字典 2.电影字典 # 使用字典key是用户idvalue是用户对电影的评价 # rate_dic[2][(1,5),(4,2)].... 表示用户2对电影1的评分是5对电影4的评分是2 # def createUserRankDic(rates): user_rate_dic{} item_to_user{} for i in rates: user_rank(i[1],i[2]) if i[0] in user_rate_dic: user_rate_dic[i[0]].append(user_rank) else: user_rate_dic[i[0]][user_rank] if i[1] in item_to_user: item_to_user[i[1]].append(i[0]) else: item_to_user[i[1]][i[0]] return user_rate_dic,item_to_user # # 计算与指定用户最相近的邻居 # 输入:指定用户ID所以用户数据所以物品数据 # 输出:与指定用户最相邻的邻居列表 # def calcNearestNeighbor(userid,users_dic,item_dic): neighbors[] #neighbors.append(userid) for item in users_dic[userid]: for neighbor in item_dic[item[0]]: if neighbor ! userid and neighbor not in neighbors: neighbors.append(neighbor) neighbors_dist[] for neighbor in neighbors: distcalcSimlaryCosDist(users_dic[userid],users_dic[neighbor]) #calcSimlaryCosDist calcCosDist calcCosDistSpe neighbors_dist.append([dist,neighbor]) neighbors_dist.sort(reverseTrue) #print neighbors_dist return neighbors_dist # # 使用UserFC进行推荐 # 输入文件名,用户ID,邻居数量 # 输出推荐的电影ID,输入用户的电影列表,电影对应用户的反序表邻居列表 # def recommendByUserFC(file_name,userid,k5): #读取文件数据 test_contentsreadFile(file_name) #文件数据格式化成二维数组 List[[用户id,电影id,电影评分]...] test_ratesgetRatingInformation(test_contents) #格式化成字典数据 # 1.用户字典dic[用户id][(电影id,电影评分)...] # 2.电影字典dic[电影id][用户id1,用户id2...] test_dic,test_item_to_usercreateUserRankDic(test_rates) #寻找邻居 neighborscalcNearestNeighbor(userid,test_dic,test_item_to_user)[:k] recommend_dic{} for neighbor in neighbors: neighbor_user_idneighbor[1] moviestest_dic[neighbor_user_id] for movie in movies: #print movie if movie[0] not in recommend_dic: recommend_dic[movie[0]]neighbor[0] else: recommend_dic[movie[0]]neighbor[0] #print len(recommend_dic) #建立推荐列表 recommend_list[] for key in recommend_dic: #print key recommend_list.append([recommend_dic[key],key]) recommend_list.sort(reverseTrue) #print recommend_list user_movies [ i[0] for i in test_dic[userid]] return [i[1] for i in recommend_list],user_movies,test_item_to_user,neighbors # # # 获取电影的列表 # # # def getMoviesList(file_name): 转载于:https://www.cnblogs.com/lixiaozhi/p/8432080.html