在了解了协同过滤算法之后,我又对基于用户协同过滤算法进行了深入的学习,同时结合了一部分基于物品协同过滤的算法,对本次电影的推荐系统进行了优化。

该项目主要使用了Python语言进行算法的实现,另外通过Django框架实现了系统的前后端服务连接,Web界面我直接使用了之前设计的界面(主要是登录注册界面),电影系统的展示等等使用了下载css样式。

其次数据方面,使用了轻量级的SQLite数据库存储,这里就简单介绍一下SQLite。SQLite 是一个开源的嵌入式关系数据库,实现了自给自足的、无服务器的、配置无需的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库系统不同,比如 MySQL、PostgreSQL 等,SQLite 不需要在系统中设置和管理一个单独的服务。这也使得 SQLite 是一种非常轻量级的数据库解决方案,非常适合小型项目、嵌入式数据库或者测试环境中。

一、概述

在当今信息爆炸的时代,随着互联网的普及和数字化娱乐的不断涌现,电影推荐系统作为一种个性化服务系统变得愈发重要。传统的电影推荐往往依赖于一般性的推荐或流行趋势,而这种静态的推荐难以满足用户多样化、个性化的需求。在这样的背景下,构建一个基于用户行为和偏好的个性化电影推荐系统显得尤为重要和必要。

用户体验的提升:提供定制化的电影推荐服务能够有效地提升用户体验。通过了解和分析用户的历史偏好和行为,推荐系统可以向用户展示更符合其口味和兴趣的电影,从而增强用户的满意度。

满足个性化需求:个性化推荐系统允许用户根据自身兴趣和喜好获得电影推荐,而不是普遍的和广义化的推荐。这样的系统能够为每位用户提供针对其独特品味的推荐内容,提高用户忠诚度和满意度。

提高电影消费率:通过推荐用户可能感兴趣的电影,系统能够激发用户对更多电影的探索和观看,从而提高电影的观看率和消费率。

技术与创新挑战:设计和开发一个高效的电影推荐系统需要探索和应用多种算法和技术,涉及数据挖掘、机器学习、用户行为分析等领域。构建一个能够持续更新和适应用户需求的系统是技术和创新上的挑战。

因此,构建一个基于用户行为和偏好的电影推荐系统旨在提高用户体验、满足个性化需求,同时也是对技术和创新的挑战和探索。

二、算法原理

协同过滤算法是推荐系统中应用广泛的一类个性化推荐算法,其核心思想是通过分析用户行为和偏好,找到用户间的相似性,以此来进行推荐。协同过滤算法主要分为用户协同过滤和物品协同过滤两种类型。

1. 用户协同过滤

用户协同过滤是基于用户之间的相似性进行推荐的算法。其基本思想是,如果用户A和用户B在过去的行为中有相似之处,那么他们在未来的兴趣也可能相似。用户协同过滤包括两个主要步骤:

通过计算用户A和用户B的历史行为数据,采用相似度计算方法(如皮尔逊相关系数、余弦相似度等),得到用户之间的相似性值。

找到与目标用户最相似的K个用户,根据这K个用户的历史喜好,为目标用户推荐他们感兴趣但目标用户未曾接触过的物品。

2. 物品协同过滤

物品协同过滤是基于物品之间的相似性进行推荐的算法。其基本思想是,如果用户A对物品X有兴趣,而物品X与物品Y相似,那么用户A对物品Y也可能感兴趣。物品协同过滤包括两个主要步骤:

通过计算物品X和物品Y的历史被用户喜好的情况,采用相似度计算方法(如余弦相似度、调整的余弦相似度等),得到物品之间的相似性值。

对于目标用户,根据他过去喜欢的物品,找到与这些物品相似的物品,将这些相似物品推荐给目标用户。

三、系统设计

1.总体架构

本基于协同过滤算法的电影推荐系统采用的是分层模型设计思想,第一层为前端页面模型设计,注重为实现页面的展示效果,主用的编程语言为JavaScript,和前端主流框架bootstrap。

第二层为后端模型设计,编程语言选了简单易懂的python,用Django作为后端框架进行开发,此框架是python web系统开发的首选框架,简单易用。

第三层为算法的设计与实现的逻辑,用协同过滤算法来实现,第四层为数据库表的设计,用SQLite数据库。

本系统web端的功能模块,主要实现影片显示、影片分类显示、热门影片排序显示、收藏影片排序显示、时间排序显示、评分排序显示、算法推荐、影片搜索、影片信息管理等功能,

并进行数据库的详细设计,完成设计阶段的各项功能,并对此系统进行功能测试,最后,系统进行相关的实际应用操作,通过系统的使用,

用户进入电影推荐系统,此系统可以根据用户对电影所打的标签行为,给用户推荐用户所感兴趣的电影,准确率在百分之75左右,用户可以查看信息,

观看影片,给影片评分等操作,本系统基本上完成了预期的基本功能。

2.系统流程

四、推荐算法介绍

1.基于用户推荐

该方法的主要步骤包括:确定相似性度量方法:该方法需要确定一个用户之间相似性的度量方法,通常使用余弦相似度或 Pearson(皮尔逊) 相关系数等方法。计算相似性:根据相似性度量方法,计算出每个用户与其他用户之间的相似度。具体而言,可以将每个用户的历史行为(包括购买记录、评分、点击历史等)视为一个向量,并使用相似性度量方法计算向量之间的相似度。

选择邻居用户:根据相似性,选择与目标用户相似度最高的 K 个用户进行推荐。一般来说,K 的取值需要根据实际情况进行调整。推荐商品:根据邻居用户的喜好记录,为目标用户推荐潜在感兴趣的商品、服务或内容。

2.基于物品推荐

与基于用户的协同过滤(User-based Collaborative Filtering)相比,基于物品的协同过滤更加灵活,因为它不需要考虑用户的行为历史和兴趣爱好,而是考虑物品之间的相似性。具体来说,该算法主要分为以下几个步骤(与基于用户的类似):

1.收集数据

首先,需要收集用户对不同物品的评分或者行为历史数据,例如购买、浏览、收藏、评分等。

2.计算物品之间的相似度

对于每一对物品,通过计算它们的相似度,来衡量它们之间的相似程度。常用的相似度计算方法包括余弦相似度、皮尔逊相关系数等。

3.找出相似物品

对于每个物品,找出和它最相似的 k 个物品,可以通过对它们的相似度进行排序来实现。

4.给用户推荐物品

对于每个用户,找出他/她喜欢过的物品中与未评分的物品最相似的 k 个物品,根据这些物品的评分预测出用户对未评分物品的兴趣程度,并将这些物品推荐给用户。

五、数据准备

1.数据库设置

我们的推荐系统简单的使用了Django框架来操作数据库,数据库的设置放在settings.py文件中进行。包括设置数据库的引擎、名称、用户、密码等信息。数据库采用了轻量级的SQLite,不需要客户端与服务器即可,操作起来也比较简单,并且本系统的需求量不大,适合使用。下面是部分数据库信息,一般放在Setting.py文件中。

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.sqlite3',

'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

}

}

'''DATABASES = {

'default': {

'ENGINE': 'django.db.backends.mysql',

'NAME': 'movie',

'USER': 'root',

'PASSWORD': '123456',

'HOST': '127.0.0.1',

'PORT': '3306',

}

}

'''

2.Django环境配置

安装 Django:在Pycharm中,使用 pip 工具来安装 Django,安装好这些包之后进行系统才能正常运行。

运行开发服务器:配置好运行环境后,通过在manage.py文件中,启动 Django 的开发服务器,在浏览器中访问 http://127.0.0.1:8000/进入推荐系统。

配置数据库:在settings.py 文件中,配置数据库引擎、名称、用户、密码等信息,以及定义应用和中间件等。

在终端使用命令:pip install -r requirements.txt(存放环境的文件名)执行

aiohttp >= 3.7.4

asgiref >= 3.3.4

async-timeout >= 3.0.1

attrs >= 21.2.0

beautifulsoup4 >= 4.9.3

bs4 >= 0.0.1

certifi >= 2020.12.5

chardet >= 4.0.0

crawler >= 0.0.2

Django >= 2.2.10

django-simpleui >= 2.1

djangorestframework >= 3.9.1

greenlet >= 1.1.0

idna >= 2.10

idna-ssl >= 1.1.0

importlib-metadata >= 4.0.1

lxml >= 4.6.3

multidict >= 5.1.0

我这个使用的是Python 3.11,建议Python版本大于3.10,其他的版本我没有尝试过。用Anaconda进行环境配置即可,或者在Pycharm中创建虚拟环境也可以,我这边创建了一个venu目录。

六、相似度计算

1.皮尔逊相关系数

1.定义

皮尔逊相关系数( Pearson correlation coefficient,PC),又称皮尔逊积矩相关系数(Pearson product-moment correlation coefficient,PPMCC或PCCs),是用于度量两个变量X和Y之间的相关(线性相关),其值介于-1与1之间。相关系数的绝对值越大,相关度越强,相关系数的绝对值越小,相关度越弱。

2.计算公式

3.代码展示

def pearson(self, user1, user2): # 数据格式为:物品id,浏览

sum_xy = 0.0 # user1,user2 每项打分的的累加

n = 0 # 公共浏览次数

sum_x = 0.0 # user1 的打分总和

sum_y = 0.0 # user2 的打分总和

sumX2 = 0.0 # user1每项打分平方的累加

sumY2 = 0.0 # user2每项打分平方的累加

for movie1, score1 in user1.items():

if movie1 in user2.keys(): # 计算公共的浏览次数

n += 1

sum_xy += score1 * user2[movie1]

sum_x += score1

sum_y += user2[movie1]

sumX2 += pow(score1, 2)

sumY2 += pow(user2[movie1], 2)

if n == 0:

# print("p氏距离为0")

return 0

molecule = sum_xy - (sum_x * sum_y) / n # 分子

denominator = sqrt((sumX2 - pow(sum_x, 2) / n) * (sumY2 - pow(sum_y, 2) / n)) # 分母

if denominator == 0:

return 0

r = molecule / denominator

return r

4.计算过程

(1)初始化变量:

sum_xy: 用于存储两个用户每项打分的累加。

sum_x: 用户1的打分总和。

sumX2: 用户1每项打分平方的累加。

(2)遍历用户1的打分数据:

对于用户1打过分的每一部电影,检查是否也在用户2的打分数据中。

(3)检查是否有公共浏览次数:

如果没有公共浏览次数(n == 0),说明两个用户没有共同的浏览记录,返回相似度为0。

(4)计算皮尔逊相关系数的分子和分母:

分子(molecule):计算两个用户打分的协方差。

分母(denominator):计算两个用户打分的标准差的乘积。

避免分母为0的情况:

如果分母为0,说明某一个用户的所有打分都相同,返回相似度为0。

(5)计算最终的皮尔逊相关系数:

使用分子除以分母得到最终的皮尔逊相关系数。

这个函数通过计算用户打分的协方差和标准差,然后将它们归一化,得到了两个用户之间的皮尔逊相关系数。这个系数用于量化两个用户在电影评分上的相似度,数值越接近1表示相似度越高。

2.余弦相似度

1.定义

余弦相似度(Cosine Similarity)是n维空间中两个n维向量之间角度的余弦。它等于两个向量的点积(向量积)除以两个向量长度(或大小)的乘积。一个向量空间中两个向量夹角间的余弦值作为衡量两个个体之间差异的大小,余弦值接近1,夹角趋于0,表明两个向量越相似,余弦值接近于0,夹角趋于90度,表明两个向量越不相似。

2.计算公式  

3.代码展示

def similarity(movie1_id, movie2_id):

movie1_set = Rate.objects.filter(movie_id=movie1_id)

# movie1的打分用户数

movie1_sum = movie1_set.count()

# movie_2的打分用户数

movie2_sum = Rate.objects.filter(movie_id=movie2_id).count()

# 两者的交集

common = Rate.objects.filter(user_id__in=Subquery(movie1_set.values('user_id')), movie=movie2_id).values('user_id').count()

# 没有人给当前电影打分

if movie1_sum == 0 or movie2_sum == 0:

return 0

similar_value = common / sqrt(movie1_sum * movie2_sum)#余弦计算相似度

return similar_value

4.计算过程

(1)获取两部电影的评分数据:

使用Django的ORM,通过Rate模型获取电影1(movie1_id)和电影2(movie2_id)的评分数据。

(2)计算电影1和电影2的打分用户数:

   movie1_sum: 电影1的打分用户数。

     movie2_sum: 电影2的打分用户数。

(3)计算两者的交集(共同打分用户数):

使用Django的ORM,找到同时给电影1和电影2打分的用户。

(4)判断是否有人给当前电影打分:

如果电影1或电影2的打分用户数为0,说明没有人给其中某一部电影打分,返回相似度为0。

(5)计算余弦相似度:

使用共同打分用户数、电影1的打分用户数和电影2的打分用户数计算余弦相似度。

七、推荐函数说明

1.基于用户推荐

recommend_by_user_id是一个电影推荐函数。该函数根据用户的行为和喜好为其推荐电影。

(1)获取用户的标签偏好:

使用 UserTagPrefer 模型查询给定用户ID(user_id)的标签偏好,按照分数降序排序,提取标签ID

(2)获取当前用户信息:

使用 User 模型获取给定用户ID的用户对象。

(3)处理用户未打分的情况:

如果当前用户没有对电影进行评分,根据标签偏好或按照浏览度推荐电影。

(4)处理用户已打分的情况:

如果用户已经对电影进行了评分,首先选择评分最多的10个用户,包括当前用户。

构建一个包含这些用户评分数据的字典 all_user,其中键是用户名,值是该用户对电影的评分。

(5)利用用户协同过滤进行推荐:

创建 UserCf 对象,并使用其 recommend 方法为当前用户推荐电影。

获取推荐的电影ID列表,并查询对应的电影对象。

(6)填充推荐列表:

如果推荐的电影数量不足15部,从未被当前用户评分的电影中按收藏数量排序补充。

这个函数通过用户标签偏好和协同过滤算法,为给定用户推荐一组电影。推荐的电影首先基于用户的标签偏好,然后通过协同过滤考虑其他相似用户的行为。最后,根据收藏数量进行补充,以确保推荐列表达到15部电影。

2.基于内容推荐

recommend_by_item_id()是一个基于物品的推荐函数。该函数根据用户的标签偏好和物品相似性为用户推荐电影。

(1)获取用户的标签偏好:

使用 UserTagPrefer 模型查询给定用户ID(user_id)的标签偏好,按照分数降序排序,提取前三个标签ID。

(2)获取当前用户信息:

使用 User 模型获取给定用户ID的用户对象。

(3)处理用户未打分的情况:

如果当前用户没有对电影进行评分,根据标签偏好或按照浏览度推荐电影。

(4)处理用户已打分的情况:

如果用户已经对电影进行了评分,首先选择用户最喜欢的前三个标签,并获取用户未看过的30部电影。

(5)计算物品相似性:

对未看过的电影和用户已打分电影计算相似度,并按照相似度降序排序。

(6)生成推荐列表:

从计算得到的相似度列表中选择前 k 个电影作为推荐列表。

这个函数通过用户标签偏好和计算物品相似性,为给定用户推荐一组电影。如果用户已经对电影进行了评分,推荐的电影将基于用户最喜欢的标签和其他用户已评分电影的相似性。如果未能获得足够数量的有效推荐,会通过填充未看过的电影中的热门电影来补充。

八、系统功能

1.登录功能

2.注册功能

3.电影展示

4.推荐结果

通过测试,可见推荐的准确率相对还是比较高的,综合来说可达到75%左右。

九、参考文献

[1]黄勉.机器学习与python实践.人民邮电出版社,2021,32(1):20-214.

[2]王衡军.机器学习.北京:清华大学出版社,2020:15-180.

[3]朱杰. 基于标签和协同过滤的图片推荐系统[D]. 天津师范大学,2014.

[4]王国霞,刘贺平. 个性化推荐系统综述[J]. 计算机工程与应用,2012:66-76.

好文阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: