基于微博用户的协同过滤系统--以python为例
- 格式:doc
- 大小:346.50 KB
- 文档页数:15
基于Python的用户协同过滤推荐系统的研究与实现作者:***来源:《电脑知识与技术》2020年第31期摘要:推荐系统可以有效地帮助用户从海量信息中获得自己的潜在需求,为用户实现个性化推荐。
本文研究了协同过滤算法,使用Python语言实现了基于用户的协同过滤推荐系统,构建了推荐系统的架构,给出了实现个性化推荐的关键代码,并在ml-latest-small 数据集上对用户相似度算法进行了测试。
关键词:相似性;协同过滤;推荐系统;Python中图分类号:TP311 文献标识码:A文章编号:1009-3044(2020)31-0234-031 概述信息技术和互联网技术的迅猛发展以及数据量爆炸式的增长,将我们带到了“信息过载”[1]的时代,使我们难以从海量的数据中获得真正需要的信息。
如何从海量信息中找到用户真正感兴趣的信息成为新的难题。
传统搜索引擎主要依赖于用户对需求的准确描述,向所有用户提供相同的推荐结果,不是个性化服务。
推荐系统不需要用户提供明确的需求,它通过分析用户的历史行为,挖掘用户兴趣并建模,主动为用户推荐能够满足他们兴趣和需要的信息[2],能够有效地为用户提供个性化服务。
2 推荐系统与相关技术2.1推荐系统和协同过滤算法推荐系统能够在信息过载的环境中,为用户精确的推荐令他们感兴趣的信息。
它不仅能够满足用户的个性化需求,而且能够增强用户关联性[3],跟踪用户偏好,提高销售能力。
推荐系统通常分为三类:基于内容的过滤、协同过滤和混合推荐。
其中,协同过滤独立于资源,且不考虑物品内容信息,易于实现,是目前最成功且应用最广的一种推荐算法。
协同过滤算法(Collaborative Filtering,CF)是根据用户的历史行为信息,计算用户之间的相似度,并推荐用户喜欢的物品。
协同过滤算法是根据用户的相似度,而不是物品的客观属性提供个性化的推荐,因此它可以过滤任何类型的物品,如电影、音乐、文本等。
根据推荐对象的不同,协同过滤算法分为基于物品的协同过滤算法和基于用户的协同过滤算法。
协同过滤算法python代码协同过滤算法是一种常用的推荐系统算法,能够根据用户的历史行为数据和用户间的相似度,预测用户对某一项产品或服务的评分或喜好程度。
下面是一段使用Python实现协同过滤算法的代码:```pythonimport numpy as npdef sim_matrix(data):'''计算用户间的相似度矩阵data: 用户-产品评分矩阵,每行表示一个用户,每列表示一个产品,缺失值用0表示return: 相似度矩阵,每行表示一个用户,每列表示一个用户 '''m, n = data.shapesim = np.zeros((m, m))for i in range(m):for j in range(m):if i != j:sim[i,j] = np.dot(data[i,:], data[j,:]) /(np.linalg.norm(data[i,:]) * np.linalg.norm(data[j,:]))return simdef predict(data, sim, user_id, item_id):'''预测用户对某一产品的评分data: 用户-产品评分矩阵,每行表示一个用户,每列表示一个产品,缺失值用0表示sim: 相似度矩阵,每行表示一个用户,每列表示一个用户user_id: 用户IDitem_id: 产品IDreturn: 预测评分'''m, n = data.shapew = 0.0s = 0.0for i in range(m):if data[i,item_id] > 0:w += sim[user_id,i] * data[i,item_id]s += sim[user_id,i]if s == 0:return 0else:return w / s# 示例data = np.array([[5, 3, 0, 1],[4, 0, 0, 1],[1, 1, 0, 5],[1, 0, 0, 4],[0, 1, 5, 4]])sim = sim_matrix(data)print(sim)pred = predict(data, sim, 0, 2)print(pred)```该代码实现了协同过滤算法的两个核心函数:相似度矩阵计算和评分预测。
《基于用户特征分析的协同过滤算法优化》篇一一、引言随着互联网的快速发展,网络信息量呈现出爆炸式增长,用户面临着信息过载的问题。
协同过滤算法作为一种有效的推荐系统技术,已经被广泛应用于解决这个问题。
然而,传统的协同过滤算法在处理大规模数据时存在一些局限性,如计算量大、推荐准确度不高等问题。
因此,本文提出了一种基于用户特征分析的协同过滤算法优化方法,以提高推荐系统的准确性和效率。
二、用户特征分析在进行协同过滤算法优化之前,首先需要对用户特征进行分析。
用户特征包括用户的兴趣爱好、行为习惯、社交关系等多个方面。
通过对用户特征的分析,可以更准确地了解用户的需求和偏好,从而提高推荐系统的准确度。
在用户特征分析中,可以采用多种方法,如基于文本分析的方法、基于社交网络的方法等。
其中,基于文本分析的方法可以通过分析用户的浏览记录、搜索记录、购买记录等数据,提取出用户的兴趣爱好和需求;而基于社交网络的方法则可以通过分析用户的社交关系和互动行为,了解用户的社交偏好和影响力。
三、协同过滤算法优化在了解了用户特征之后,我们可以对协同过滤算法进行优化。
优化主要包括两个方面:算法模型的改进和计算效率的提高。
1. 算法模型改进传统的协同过滤算法主要基于用户或物品的相似度进行推荐,忽略了用户特征的重要性。
因此,我们可以将用户特征引入到算法中,以提高推荐的准确度。
具体来说,可以采用基于用户特征的协同过滤算法,如基于用户兴趣偏好的协同过滤、基于用户社交关系的协同过滤等。
这些算法可以根据用户的兴趣爱好、社交关系等特征,更准确地预测用户的偏好和需求,从而提高推荐的准确度。
2. 计算效率的提高在处理大规模数据时,传统的协同过滤算法计算量大、效率低下。
因此,我们可以采用一些优化方法来提高计算效率。
例如,可以采用基于矩阵分解的方法对用户-物品评分矩阵进行降维处理,减少计算量;同时,可以采用分布式计算的方法将计算任务分配到多个节点上并行处理,提高计算速度。
作者简介:张阳(1986—),男,硕士,助教。
研究方向:计算机应用技术,人工智能。
基于Python 的用户协同过滤推荐系统的综合研究张阳(吉林工业职业技术学院经管与艺术学院,吉林吉林132013)摘要:关键词:中图分类号:G622.3文献标识码:A信息技术的广泛应用给人们生活带来显著的便利之一就是人们的沟通方式从线下面对面转变为线上使用社交媒体。
微博是诸多社交媒体中颇具影响力的一个,为解决用户在海量信息中迅速找到自己感兴趣话题的问题,介绍基于用户的协同过滤推荐系统在微博中的应用,并结合着业界最新的Python 技术去做推荐系统的设计与实现。
Python ;微博;协同过滤;推荐系统第33卷第4期圆园员9年第4期Vol.33No.4NO.4.2019技术与教育TECHNIQUE &EDUCATION 1引言创建于2006年的Twitter (推特)是一家美国社交网络服务及微博服务网站,是微博客的典型应用,也是国际上著名的微博之一。
2007年国内第一个颇具社交色彩的在线平台饭否网上线,直至2009年微博在国内才逐渐兴起,这都是社交网络发展历史上十分重要的里程碑。
自微博出现之后,越来越多的人开始使用和关注微博,这就使得微博的人气越来越高[1]。
微博的发展是可以预见的,在未来微博肯定会获得越来越多的认可。
关注和分享功能是微博的重要功能,微博使用者可以通过客户端分享自己的感想,随时传递相关信息。
随着技术的发展,微博传递的信息量越来越大,功能越多越多,使得整体的系统性越来越完善。
但需要注意的是,随着越来越多人的使用和流量的增加,“大咖”的信息发布频率提升,微博的体量也变得越来越大。
如何在如此庞大的海量信息中找到用户真正想要的信息将会直接制约着软件的整体使用效率,也会直接影响用户的体验感觉。
近些年来虽然有很多学者都对相关的推荐机制做出了研究,比如华南理工大学的融合社交信息的个性化推荐研究[2]和哈尔滨工业大学有关知识词条推荐的算法研究等[3]。
协同过滤算法python代码协同过滤算法是一种基于用户行为数据的推荐算法,可以帮助用户发现自己可能感兴趣的物品或者服务。
下面是一个简单的协同过滤算法的Python代码示例:```python# 导入相关的库import numpy as np# 定义基于用户的协同过滤算法def user_cf(data, user, k=3):# 计算用户之间的相似度矩阵sims = {}for u in data:if u != user:sims[u] = np.dot(data[user], data[u]) /(np.linalg.norm(data[user]) * np.linalg.norm(data[u]))# 对相似度矩阵进行排序,取出前k个相似的用户sorted_sims = sorted(sims.items(), key=lambda x: x[1], reverse=True)[:k]top_users = [u[0] for u in sorted_sims]# 对物品进行推荐items = {}for u in top_users:for item in data[u]:if item not in data[user]:if item not in items:items[item] = 0items[item] += sims[u] * data[u][item]# 对推荐结果进行排序sorted_items = sorted(items.items(), key=lambda x: x[1], reverse=True)return sorted_items# 测试代码data = {'user1': {'item1': 1, 'item2': 1, 'item3': 1}, 'user2': {'item1': 1, 'item3': 1},'user3': {'item2': 1, 'item4': 1},'user4': {'item3': 1, 'item4': 1}}print(user_cf(data, 'user1'))```上面的代码定义了一个基于用户的协同过滤算法,并且对一个简单的数据进行了测试。
《基于协同过滤算法的个性化电影推荐系统的实现》篇一一、引言随着互联网的迅猛发展,电影资源的不断丰富,人们面临着众多的电影选择。
然而,如何在众多的电影资源中寻找到真正符合个人口味的电影成为了人们迫切需要解决的问题。
因此,个性化电影推荐系统应运而生。
本文将介绍一种基于协同过滤算法的个性化电影推荐系统的实现。
二、协同过滤算法概述协同过滤算法是一种常用的推荐系统算法,其基本思想是利用用户的历史行为数据,寻找与目标用户兴趣相似的其他用户,然后根据这些相似用户的喜好进行推荐。
协同过滤算法主要包括用户之间的协同过滤和基于项目的协同过滤。
三、系统设计(一)数据预处理首先,我们需要收集用户的观影历史数据,包括用户观看的电影、评分等信息。
然后对这些数据进行清洗、去重、归一化等预处理操作,以便后续的算法处理。
(二)用户相似度计算在协同过滤算法中,用户相似度的计算是关键。
我们可以采用余弦相似度、皮尔逊相关系数等方法来计算用户之间的相似度。
系统将计算所有用户之间的相似度,并存储在相似度矩阵中。
(三)推荐算法实现基于用户相似度,我们可以采用最近邻法、基于矩阵分解的方法等来实现推荐算法。
系统将根据目标用户的相似用户及其喜欢的电影,为目标用户推荐相似的电影。
(四)推荐结果输出系统将根据推荐算法计算出的结果,将推荐的电影按照一定顺序(如评分高低、更新时间等)输出给用户。
同时,系统还将提供一些额外的功能,如电影详情查看、电影评价等。
四、系统实现(一)技术选型系统采用Python语言进行开发,使用pandas、numpy等数据科学库进行数据处理和计算,使用Flask等Web框架进行Web服务开发。
同时,为了加速数据处理和计算,系统还采用了分布式计算框架Hadoop和Spark。
(二)数据库设计系统采用MySQL数据库进行数据存储。
数据库包括用户表、电影表、评分表等。
其中,用户表存储用户的基本信息;电影表存储电影的基本信息;评分表存储用户对电影的评分信息。
基于物品的协同过滤算法代码详细物品协同过滤算法是一种推荐系统算法,旨在根据用户对物品的评分和行为,为用户推荐相关的物品。
下面是一份基于物品的协同过滤算法的详细代码。
```pythonimport numpy as npfrom sklearn.metrics.pairwise import cosine_similarityclass ItemCollaborativeFiltering:def __init__(self, similarity_measure="cosine"):self.similarity_measure = similarity_measureself.item_similarity_matrix = Nonedef fit(self, ratings_matrix):#计算物品之间的相似度矩阵if self.similarity_measure == "cosine":self.item_similarity_matrix =cosine_similarity(ratings_matrix.T)def predict(self, ratings_matrix, user_id):#预测用户对物品的评分user_ratings = ratings_matrix[user_id]rated_items = np.nonzero(user_ratings)[0] # 用户已评分物品的索引unrated_items = np.where(user_ratings == 0)[0] # 用户未评分物品的索引ratings_pred = np.zeros_like(user_ratings)for item in unrated_items:#计算未评分物品与已评分物品的相似度similarities = self.item_similarity_matrix[item, rated_items] #找到与未评分物品相似度最高的k个已评分物品k_similar_items = np.argsort(similarities)[-k:]#计算加权平均评分作为对未评分物品的预测评分ratings_pred[item] = np.dot(similarities[k_similar_items], user_ratings[rated_items[k_similar_items]])ratings_pred[item] /= np.sum(similarities[k_similar_items]) return ratings_pred#示例用法ratings_matrix = np.array([[1, 2, 3, 0, 0],[0,4,1,2,0],[0,0,5,3,0],[0,0,0,5,1]])cf = ItemCollaborativeFilteringcf.fit(ratings_matrix)user_id = 0k=2ratings_pred = cf.predict(ratings_matrix, user_id)print(f"用户{user_id}对物品的预测评分为{ratings_pred}")```上述代码实现了基于物品的协同过滤算法的关键步骤。
⽤Python实现协同过滤的教程协同过滤在⽤户 —— 物品(user - item)的数据关系下很容易收集到⼀些偏好信息(preference),⽐如评分。
利⽤这些分散的偏好信息,基于其背后可能存在的关联性,来为⽤户推荐物品的⽅法,便是协同过滤,或称协作型过滤(collaborative filtering)。
这种过滤算法的有效性基础在于:⽤户的偏好具有相似性,即⽤户是可分类的。
这种分类的特征越明显,推荐的准确率就越⾼物品之间是存在关系的,即偏好某⼀物品的任何⼈,都很可能也同时偏好另⼀件物品不同环境下这两种理论的有效性也不同,应⽤时需做相应调整。
如⾖瓣上的⽂艺作品,⽤户对其的偏好程度与⽤户⾃⾝的品位关联性较强;⽽对于电⼦商务⽹站来说,商品之间的内在联系对⽤户的购买⾏为影响更为显著。
当⽤在推荐上,这两种⽅向也被称为基于⽤户的和基于物品的。
本⽂内容为基于⽤户的。
影评推荐实例本⽂主要内容为基于⽤户偏好的相似性进⾏物品推荐,使⽤的数据集为 GroupLens Research 采集的⼀组从 20 世纪 90 年代末到 21 世纪初由 MovieLens ⽤户提供的电影评分数据。
数据中包含了约 6000 名⽤户对约 4000 部电影的 100万条评分,五分制。
数据包可以从⽹上下载到,⾥⾯包含了三个数据表——users、movies、ratings。
因为本⽂的主题是基于⽤户偏好的,所以只使⽤ ratings 这⼀个⽂件。
另两个⽂件⾥分别包含⽤户和电影的元信息。
本⽂使⽤的数据分析包为 pandas,环境为 IPython,因此其实还默认携带了 Numpy 和 matplotlib。
下⾯代码中的提⽰符看起来不是 IPython 环境是因为 Idle 的格式发在博客上更好看⼀些。
数据规整⾸先将评分数据从 ratings.dat 中读出到⼀个 DataFrame ⾥:>>> import pandas as pd>>> from pandas import Series,DataFrame>>> rnames = ['user_id','movie_id','rating','timestamp']>>> ratings = pd.read_table(r'ratings.dat',sep='::',header=None,names=rnames)>>> ratings[:3]user_id movie_id rating timestamp0 1 1193 5 9783007601 1 661 3 9783021092 1 9143 978301968[3 rows x 4 columns]ratings 表中对我们有⽤的仅是 user_id、movie_id 和 rating 这三列,因此我们将这三列取出,放到⼀个以 user 为⾏,movie 为列,rating 为值的表 data ⾥⾯。
python实现基于⽤户的协同过滤算法(CF)——以电影评价数据(ml-100k)为例⽬录程序简介项⽬以ml-100k电影评分数据集为输⼊,实现了基于⽤户的协同过滤算法,最后预测的MAE为0.84,因为经过优化,10万条评分数据运⾏时间不超过2分钟协同过滤算法(CF)基于对⽤户历史⾏为数据的挖掘发现⽤户的喜好偏向,并预测⽤户可能喜好的产品进⾏推荐。
也就是常见的“猜你喜欢”,和“购买了该商品的⼈也喜欢”等功能。
程序/数据集下载代码分析导⼊模块、路径、预设参数# -*- coding: utf-8 -*-import numpy as npfrom numba import jitimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.metrics import mean_absolute_error as MAEimport os######################参数#################################topK = 20#近邻⽤户数testRate = 0.2#测试⽐例seed = 2#随机种⼦testCount = 1000#最终参与测试⾏为数(不然运⾏太慢)###########################################################⽤来正常显⽰中⽂标签plt.rcParams['font.sans-serif']=['SimHei']#⽤来正常显⽰负号plt.rcParams['axes.unicode_minus']=False#路径⽬录baseDir = ''#当前⽬录staticDir = os.path.join(baseDir,'Static')#静态⽂件⽬录resultDir = os.path.join(baseDir,'Result')#结果⽂件⽬录载⼊数据,设置索引(这样会快很多很多),查看数据前5⾏#读数据users = pd.read_table(staticDir+'/电影评分数据/er',sep="|",names=['user_id','age','sex','occupation','zip_code'],encoding='latin-1',engine='python')ratings = pd.read_table(staticDir+'/电影评分数据/u.data', sep='\t', names=['user_id', 'movie_id', 'rating', 'unix_timestamp'],encoding='latin-1',engine='python')movies = pd.read_table(staticDir+'/电影评分数据/u.item',engine='python', sep='|',header=None,encoding='latin-1',names=['movie_id','title','release_date','video_release_date','IMDb_URL','unknown','Action','Adventure','Animation','Children','Comedy','C movies = movies.iloc[:,:5]#设置索引users = users.set_index(['user_id'],drop=False)movies = movies.set_index(['movie_id'],drop=False)ratings = ratings.set_index(['user_id','movie_id'],drop=False)⽤户数据users.head()user_id age sex occupation zip_codeuser_id1124M technician857112253F other940433323M writer320674424M technician435375533F other15213电影数据movies.head()movie_id title release_date video_release_date IMDb_URLmovie_id11Toy Story (1995)01-Jan-1995NaN /M/title-exact?Toy%20Story%2...22GoldenEye (1995)01-Jan-1995NaN /M/title-exact?GoldenEye%20(...33Four Rooms (1995)01-Jan-1995NaN /M/title-exact?Four%20Rooms%...44Get Shorty (1995)01-Jan-1995NaN /M/title-exact?Get%20Shorty%...55Copycat (1995)01-Jan-1995NaN /M/title-exact?Copycat%20(1995)评分数据(⾏为数据)ratings.head()user_id movie_id rating unix_timestampuser_id movie_id1962421962423881250949186302186302389171774222377223771878887116244512445128806069231663461663461886397596分割评分数据集为测试集和训练集#分割⾏为数据成测试集和训练集np.random.seed(seed)testIndex = np.random.choice(range(ratings.shape[0]),size=int(ratings.shape[0]*testRate),replace=False)testRatings = ratings.iloc[testIndex,:]trainIndex = list(set(range(ratings.shape[0]))-set(testIndex))trainRatings = ratings.iloc[trainIndex,:]电影数据新增users列,统计出每部电影被哪些⽤户观看过,查看前5⾏#统计所有电影在训练集被观看的⽤户iddef calUsers(movieId):#观影记录try:views = trainRatings.loc[(slice(None),movieId),:]except:return []users = views['user_id'].values.tolist()return usersmovies['users'] = movies['movie_id'].apply(calUsers)movies.head()movie_id title release_date video_release_date IMDb_URL users movie_id11Toy Story (1995)01-Jan-1995NaN /M/title-exact?Toy%20Story%2...[308, 287, 148, 280, 66, 109, 181, 95, 189, 14...22GoldenEye (1995)01-Jan-1995NaN /M/title-exact?GoldenEye%20(...[5, 268, 276, 87, 250, 201, 64, 13, 213, 373, ...33Four Rooms(1995)01-Jan-1995NaN/M/title-exact?Four%20Rooms%...[181, 81, 130, 49, 320, 145, 95, 99, 267,417,...44Get Shorty (1995)01-Jan-1995NaN /M/title-exact?Get%20Shorty%...[99, 19, 207, 295, 201, 10, 308, 328, 109,334...55Copycat (1995)01-Jan-1995NaN /M/title-exact?Copycat%20(1995)[293, 43, 311, 109, 344, 145, 314, 308, 280, 4...⽤户数据新增movies列,统计所有⽤户在训练集看过的电影id,查看前5⾏#统计所有⽤户在训练集看过的电影iddef calMovies(userId):#观影记录try:views = trainRatings.loc[(userId,slice(None)),:]except:return []movies = views['movie_id'].values.tolist()return moviesusers['movies'] = users['user_id'].apply(calMovies)users.head()user_id age sex occupation zip_code moviesuser_id1124M technician85711[61, 189, 33, 160, 20, 202, 171, 265, 117, 47,...2253F other94043[292, 251, 314, 297, 312, 281, 13, 303, 308, 2...3323M writer32067[335, 245, 337, 343, 323, 331, 294, 332, 334, ...4424M technician43537[264, 303, 361, 357, 260, 356, 294, 288, 50, 2...5533F other15213[2, 439, 225, 110, 454, 424, 363, 98, 102, 211...计算相似度矩阵,查看前5⾏5列,元素即每个⽤户之间相互的相似度,计算公式如下#计算相似度矩阵sims = pd.DataFrame(0,columns=users.index,index=users.index)def calSim(userId1,userId2):#⽤户1的物品user1Items = users.loc[userId1,'movies']#物品2的⽤户user2Items = users.loc[userId2,'movies']#两个物品共同⽤户cross = list(set(user1Items) & set(user2Items))#相似度sim = len(cross)/((max(1e-1,len(user1Items))*max(1e-1,len(user2Items)))**0.5)return simdef fillSims(row):userIds = pd.Series(row.index)row[:] = userIds.apply(calSim,args=(,))return rowsims = sims.apply(fillSims,axis=1)sims.iloc[:5,:5]user_id12345user_id1 1.0000000.1160080.0690670.0644490.27550020.1160081.0000000.1428870.1333330.03638030.0690670.1428871.0000000.2381450.01237740.0644490.1333330.2381451.0000000.04042350.2755000.0363800.0123770.0404231.000000⽤户数据新增nears列,统计⽤户的邻近⽤户,查看前5⾏#计算⽤户的邻近⽤户def calNearUsers(userId):#该物品的相似度向量,选取topK个物品nearUserIds = sims.loc[:,userId].sort_values(ascending=False)[1:topK+1]nearUserIds = nearUserIds.index.tolist()return nearUserIdsusers['near'] = users['user_id'].apply(calNearUsers)users.head()user_id age sex occupation zip_code movies near user_id1124M technician 85711[61, 189, 33, 160, 20, 202, 171, 265, 117, 47,...[457, 435, 916, 648, 933, 276, 864, 297, 805, ...2253F other 94043[292, 251, 314, 297, 312, 281, 13, 303, 308, 2...[701, 673, 926, 131, 306, 569, 937, 520, 486, ...3323M writer 32067[335, 245, 337, 343, 323, 331, 294, 332, 334, ...[752, 489, 784, 587, 863, 529, 783, 428, 126, ...4424M technician 43537[264, 303, 361, 357, 260, 356, 294, 288, 50, 2...[33, 816, 750, 408, 443, 783, 725, 596, 355, 6 (5)533Fother15213[2, 439, 225, 110, 454, 424, 363, 98, 102, 211...[222, 648, 407, 56, 495, 254, 497, 457, 727, 1...user_id age sex occupation zip_code movies nearuser_id 对测试集评分进⾏预测,查看前5⾏,最终测试MAE 为0.84,公式如下def predict(row):'''预测评分'''userId = row['user_id'] movieId = row['movie_id'] #topK 个邻近⽤户nearUserIds = users.loc[userId,'near'] #⽤户在训练集的物品itemUserIds = movies.loc[movieId,'users'] #物品交集cross = list(set(nearUserIds) & set(itemUserIds)) #预测评分 up = 0#分母 down = 0#分⼦for nearUserId in cross:sim = sims.loc[nearUserId,userId] down += sim#⽤户对邻近物品评分score = trainRatings.loc[(nearUserId,movieId),'rating'] up += score * sim if up == 0: return None else:return up/down#开始测试testRatings['predict'] = testRatings.apply(predict,axis=1)testRatings = testRatings.dropna()mae = MAE(testRatings['rating'],testRatings['predict'])print('测试集MAE 为%.2f'%mae)testRatings.head()测试集MAE 为0.84user_id movie_id rating unix_timestamppredict user_id movie_id 1572731572735886889876 3.740361405106540510651885546069 3.7901512445502445501880602264 3.1640833787683787684880333598 2.78618191911191911148752886813.691650。
基于协同过滤的推荐算法及代码实现基于协同过滤的推荐算法是一种常用的个性化推荐算法,其基本思想是根据用户的历史行为数据推断用户可能喜欢的物品,然后将这些物品推荐给用户。
这种算法不依赖于物品的属性信息,而是通过分析用户之间的相似性来进行推荐。
协同过滤算法主要有两类:基于用户的协同过滤和基于物品的协同过滤。
基于用户的协同过滤算法是通过计算用户之间的相似度,找到和目标用户相似度最高的一组用户,然后将这组用户喜欢的物品推荐给目标用户。
基于物品的协同过滤算法是通过计算物品之间的相似度,找到用户喜欢的物品相似度最高的一组物品,然后将这组物品推荐给用户。
下面是一个基于用户的协同过滤推荐算法的代码实现的示例:```pythonimport numpy as np#创建用户-物品矩阵data = np.array([[4, 0, 2, 0, 1],[5,1,0,0,0],[1,0,3,4,0],[0,6,0,3,2]])#计算用户之间的相似度def user_similarity(data):similarity = np.dot(data, data.T)norm = np.linalg.norm(data, axis=1)norm_similarity = np.outer(norm, norm)similarity /= norm_similarityreturn similarity#根据用户相似度和历史评分预测用户对未评分物品的评分def predict(user_similarity, data):return np.dot(user_similarity, data) /np.sum(user_similarity, axis=1)#用户之间的相似度矩阵similarity_matrix = user_similarity(data)#预测用户对未评分物品的评分prediction = predict(similarity_matrix, data)#输出预测评分矩阵print(prediction)```以上代码实现了一个基于用户的协同过滤推荐算法。
基于微博用户的协同过滤推荐系统--以python为例袁玉芳 12214043(师大学数学与统计学院 221116)摘要微博即微型博客,是一种通过关注机制分享即时信息的社交网络平台.在经过十几年的发展,到2013年时新浪微博的注册量就已经达到了5.36亿.微博以其独特的运行方式吸引了世界各地的网民,在中国微博也获得了大量网友的青睐.本文是根据部分随机微博用户所关注的标签,通过计算各用户间的相关系数,将基于用户的协同过滤技术应用到微博信息推荐中,对目标用户推荐其潜在关注东西.关键词微博;推荐系统;协同过滤;python0 引言从2006年twitter的建立,到2007国第一个具有微博色彩的饭否网,微博开始了轰轰烈烈的发展.越来越多的人开始使用微博.关注功能的使用带来的是一场微博人气的大战,名人开始使用微博聚揽人气,草根也怀有成为名人的梦想,网红群体的出现刺激大量籍籍无名的群众,从默默无闻到一夜成名往往就在不经意之间.微博用户可以通过客户端发布在140字(包括标点符号)的文字信息,并实现即时分享.随着时间的发展,140字的限制也已取消.可以传播的信息量也就越大.微博的关注功能使得用户可以获得他人的微博信息,因此如何从这庞大的信息中获取用户希望看到的信息具有重要意义.近几年,研究微博推荐系统的论文有很多,比如华南理工大学林文旋的硕士论文,基于用户兴趣的微博个性化信息推荐研究[1],还有工业大学汤斌的硕士论文,基于微博的知识词条推荐算法研究[2],华中科技大学硕士论文,微博协同过滤推荐系统的设计与实现[3]等等.推荐系统使软件的实用性大大提高,它使得用户自动获取有用的信息,极减少了搜索时间.在Google之前的众多浏览器之所以输给Google,正是由于Google研发了推荐系统,极大满足了用户需求.之后搜索引擎的开发大都注重了推荐系统的研发.更为突出的是,现在流行的app基本也都含有推荐这个功能,如淘宝,京东,亚马逊等等.而python软件以其简单的语法,强大的功能征服了很多人,它不仅含有很多功能的模块以供使用,更可以融合其他语言,使其他语言在平台上运行.但是因为相关书籍大都是英文,中文译本较少,所以python在国可找到的资料并不是很多,应用也并不是很广泛,但不能否认的是它的确是一款实用且强大的计算机编程软件.互联网发展至今已达到了令人惊讶的地步,它给用户带来了大量的信息,满足了用户在信息时代对信息的需求,但网络的迅速发展所带来的海量信息,使无法直接从中获得自己真正有用的那部分,所以信息的使用效率反而降低了,这就是所谓的信息超载(informationoverload)问题.而推荐算是在这样的情况下火起来的,因为互联网的信息爆发有了大量的数据,这使得推荐系统有了用武之地.与传统搜索引擎相比,推荐系统通过研究用户兴趣偏好,进行计算,发现用户的潜在兴趣,从而使用户获得期望信息.就比如假如我们直接搜索,我们可以通过搜索引擎获得精准的信息,可当我们不知道自己想要找什么的时候,推荐系统的优势就显现出来了.随着 web2.0 技术的日益成熟,为了给用户提供更好的体验进而达到一些商业目的,越来越多的系统提供个性化推荐服务,比如Netflix, Google.推荐算法也得到了越来越多的学者的关注和研究.推荐系统使用户不需要主动查找自己感兴趣的信息,也不用填写意向表格,系统将直接根据用户的历史行为信息为用户进行新信息的推荐.推荐系统的目的是为每个用户推荐“个性化”的项目.(推荐系统旨在给不同的用户推荐符合其个性化要求的项目)1995年3月(20世纪末),卡耐基.梅隆大学的RobertArmstrong等人在美国人工智能协会上提出了个性化导航系统Web Watcher;斯坦福大学的MarkoBalabanovic 等人在同一会议上推出了个性化推荐系统LIRA.经过不间断的发展,(在美国人工智能协会上来自卡耐基梅隆大学的罗伯特.阿姆斯特朗和斯坦福大学的马克。
巴拉巴诺维奇俩人分别推出了个性化导航系统Web Watch与个性化推荐系统LIRA,随着信息化、大数据时代的全面到来)推荐系统现在正在我们生活中发挥重要作用。
它将用户的信息与推荐对象的信息相匹配,然后利用推荐算法进行计算,找到相似的物品推荐给用户。
Python是一种面向对象,解释型计算机程序设计语言,由Guido van Rossum于1989年底发明.其语法简介明了,具有丰富和强大的类库,它能够将其他语言制作的各种模块如C,C++轻松的在一起.Python代表着简单主义,因为其简单的语法,它很容易上手.作为一款计算机程序设计语言,python几乎可以被应用于任何地方.从软件质量上看,python的代码设计致力于可读性,这使得python具备了优秀的可重用性和可维护性.即使代码非本人所写,python代码的一致性也保证了其代码容易理解.Python的开发效率相对于其他语言来说更高,它的代码大小往往只有C++或Java的1/5-1/3,因此无论是录入还是调试,维护都仅需要少量代码.且python程序可立即运行,无需编译.Python置了众多预编译并可移植的功能模块,这些模块即标准库.标准库支持一系列应用级的编程任务,涵盖了从字符模式到网络脚本编程的匹配等方面,此外还通过自行开发的库或者众多第三方应用支持软件进行扩展.Python相较于其他语言来说属于高级语言,在编写方面以简答著称,但这并不意味着python 编写复杂程序上面会非常吃力.反而Python可以做很多事情,很多著名的包括YouTube就是Python写的;也可以做网络游戏的后台,很多在线游戏的后台都是Python开发的,比如EVE Online这款大型多人网络游戏.NASA,Los Alamos也使用python实现科学计算任务,等等.在本篇文章中选择以python来进行设计正是因为python的简单容易上手,且功能强大,它可以用其简单的语言实现复杂的功能. 本文所研究的就是以微博用户关注的信息为容,使用python软件,利用协同过滤的方法想用户推荐其未关注的容.1协同过滤推荐系统协同过滤推荐(Collaborative Filtering Recommendation)技术是推荐系统中应用最早和最为成功的技术之一.协作型过滤算法通常选择对一大群人搜集其偏好,从中找到与目标用户品味相近的一小群人.算法会对这一小群人的关注信息进行考察,并组合在一起构造出一个推荐列表,这个推荐列表的信息是经过排名的,我们可以通过排名看出用户可能感兴趣的信息的可能性大小.协同过滤是基于这样的假设:如果一个用户想要找到他真正感兴趣的容,可以有这样的方法:首先找到与此用户有相似偏好的用户,然后将这些用户感兴趣的容推荐给此用户.这个基本思想非常易于理解,比如我们在日常生活中,想要了解一件商品,或者电影,歌曲等,我们一般会选择向朋友进行询问,然而在这些朋友中有些人的品味比较高,有的人不太好,我们就会选择与我们品味相似的朋友,让他们进行推荐.协同过滤推荐系统正是把这一思想运用到电子商务中来,以给使用者带来更好的使用体验.基于协同过滤的推荐系统是用户的角度来进行推荐的,自动获取推荐结果,即用户获得的推荐是系统是从用户的搜索,浏览历史中得来的,不需要用户使用搜索引擎一直搜素直到找到适合自己兴趣的信息,也不用填写调查表格之类的东西.协同过滤方法一般分为两类:基于存的(也叫基于近邻的)方法和基于模型的方法.其中基于近邻的协同过滤又可以分为基于项目的协同过滤(item-based collaborative filtering , IBCF)和基于用户的协同过滤(user-based collaborative filtering , UBCF).1.1收集用户偏好协同过滤推荐系统需要使用用户的历史行为数据与偏好数据,推荐算法基于此工作的,那么偏好信息的采集就成为了推荐系统设计的第一步.对于用户来说,很多方式都可以向系统提供自己的偏好信息,例如收藏信息,搜索信息,购买信息,还有一些问卷调查方式等等,且不同的数据获得的结果也不尽相同.收集完用户偏好信息之后,我们需要对数据进行一定的预处理.在对数据进行处理的过程中,最核心的部分就是:减噪和归一化.(1)减噪:用户的偏好信息是用户在使用应用过程中产生的,这些数据不可避免存在大量的无用信息还有用户的误操作.通过经典的数据挖掘算法我们可以过滤掉初始数据中的噪音,在进行分析时就会更加准确.(用户在使用应用过程会产生大量有价值的偏好信息,但随之而来的是这些数据中也有许多无用的信息和误操作导致的干扰信息。
我们要想得到更为准确的分析结果,就要利用经典数据挖掘算法来过滤掉无效数据,这种做法被形象的称为“降噪”。
)(2)归一化:在初始的用户偏好信息中,我们发现不同行为的数据取值相差会很大.比如,用户的浏览过的数据肯定比购买数据大的多.这对于计算来说会造成很大的误差,那么为了将各种数据统一在一个取值围中,从而加权求和得到的总体结果更加准确,就需要对数据进行归一化处理.最简单一种归一化处理方式,就是将每类数据分别除以此类中的最大值,使处理过的数据取值在 [0,1] 围中.对数据进行完基本处理后,根据不同分析方法,可以进行分组或加权.然后我们就可以得到一个用户偏好的矩阵,行是用户列表,列是物品列表,值是用户对物品的偏好评分.1.2找到相似的用户或物品在搜集完人们的偏好数据后,需要确定人们在兴趣方面的相似程度.我们将每个人的数据分别与其他人进行比较,计算他们的相似度评价值.目前有多种方法来计算,这里选两种进行介绍.欧几里德距离:(,)d x y =(1)其中i x 是x 用户对其用户列表中第i 个物品的评分,j y 是y 用户对其用户列表中第j 个物品的评分.皮尔逊相关度:()()()(),,,22,,cov(,)i abi i a iab iba b a b R Ra iab ibt Ut Urr rr R R rr rr ρσσ∈∈--==--∑∑∑ (2)该相关系数是基于用户的协同过滤推荐系统的皮尔逊相关系数,它是判断两组数据和某一直线的拟合程度.它表示用户a 与b 的皮尔逊相关系数,U 表示用户a 与b 都评分过的项目集合,,a i r 与,b i r 表示a 用户与B 用户分别对i 物品的评分,而a r 与b r 表示a 用户与b 用户对所有物品的评分.它在数据并不是很规的情况下,会倾向给出更好的结果.选择与目标用户最相似的K 个用户,组成目标用户的一个集合,利用邻居用户评分的值来预测当前用户对物品的评分.1.3获得推荐基于协同过滤的推荐算法有两类,分别为基于用户和基于物品的推荐算法.1.3.1基于用户的协同过滤基于用户的协同过滤算法是在用户的历史偏好的数据上计算用户的相似度,它的基本假设是,喜欢类似物品的用户可能有相同或者相似的偏好.图1.3.1基于用户的协同过滤推荐系统原理图上图示意出基于用户的协同过滤推荐机制的基本原理,假设用户 A 喜欢(倾向于购买商品)物品 A 和 C ,用户 B 喜欢物品 B ,用户 C 喜欢物品 A , C 和D.从这些用户的历史喜好信息中,我们可以发现用户 A 和用户 C 的口味和偏好是比较类似的,同时用户 C 还喜欢物品 D ,那么我们可以推断用户 A 可能也喜欢物品 D ,因此可以将物品 D 推荐给用户 A.1.3.2 基于项目的协同过滤基于项目的协同过滤推荐也有建立在一个假设的基础上,即一个人会喜欢和他曾经喜欢过的项目相类似的项目.它推荐的基本原理如下图所示,与基于用户的协同过滤原理比较类似,数据源都是所有用户对项目的评级,但是目的是计算项目和项目之间的相似程度,将与历史喜好的项目相似的项目推荐给目标用户.图1.3.2基于项目的协同过滤推荐系统原理图如上图所示,用户 A 同时喜欢项目 A 和 C,用户 B 同时喜欢项目 A、B 和 C,从这些数据中可以推断出项目 A 和 C 是相似的.由于用户 C 曾经喜欢项目 A,那么就把与项目 A 相似的项目 C 推荐给用户 C.基于项目的协同过滤是通过项目的相似性来为用户推荐的,因此会偏向于推荐用户的主要兴趣领域的项目,而非主要兴趣领域的推荐结果不充分,因此推荐的多样性不足,也缺乏热点信息.这种推荐方式适用于项目数较少、用户数较多的场景.(从上图中我们可以得知,用户A喜欢三个物品中的俩个,用户B则对三个物品都有好感)中间这句话我没看懂是什么意思,逻辑有点乱(项目中的协同过滤是以项目的相似性为基础为使用者推荐其最有可能感兴趣的项目,这难免会有所遗漏,忽视使用者的一些需求。