铁门关市网站建设_网站建设公司_虚拟主机_seo优化
2026/1/5 21:55:23 网站建设 项目流程

博主介绍:✌全网粉丝50W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战8年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

点击查看作者主页,了解更多项目!

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、毕业设计:2026年计算机专业毕业设计选题汇总(建议收藏)✅

2、大数据毕业设计:2026年选题大全 深度学习 python语言 JAVA语言 hadoop和spark(建议收藏)✅

1、项目介绍

技术栈:Python语言 MySQL数据库 Django框架 Echarts可视化 网络爬虫技术 协同过滤推荐算法 html

随着流媒体时代的到来,音乐推荐系统随之具有重要的地位。本系统使用Python开发,运用协同过滤推荐算法,完成通过用户的行为向其推荐音乐的目的。后端主要使用Django框架,前端页面的开发选择了Bootstrap框架。利用MySQL数据库存储信息。本系统的前端用户模块主要包括注册、登录、音乐标签分类、音乐推荐、音乐列表、音乐排序等、后台管理模块主要包括用户管理、音乐歌曲管理、用户权限管理等。推荐算法方面同时含有基于用户的协同过滤以及基于物品的协同过滤推荐。

关键词 音乐推荐; 协同过滤推荐算法; Python语言;可视化

2、项目界面

(1)音乐数据详情页

(2)首页排序

(3)词云图分析

(4)柱状图分析

(5)折线图分析

(6)饼图分析

(7)基于物品推荐算法推荐音乐

(8)音乐分类

(9)基于用户推荐算法推荐音乐

(10)后台管理

(11)注册登录

3、项目说明

本系统的功能性需求主要为实现音乐数据的管理和推荐,本平台要求增、删、改、查可以完全满足平台的所有业务信息。具体而言,本平台要求系统可以针对用户对音乐的评分和收藏的用户行为对音乐内容进行推荐操作,根据用户偏好特征,音乐标签维度,进行内容检索推荐,计算出用户可能会喜欢的音乐,从而实现基于内容和基于用户的协同过滤推荐。
综上所述,本系统应有由四个独立的模块构成,四个模块能够进行内部的链接交互,每个具体功能模块描述如下:
(1)音乐推荐系统首页
根据不同的排序展示歌曲列表、排序分为热度排序、时间排序、收藏排序、评分排序
(2) 登录注册页面
普通用户可以进行登录注册操作,向系统中录入个人信息。
(3) 标签展示
根据用户选择的标签显示属于该标签下的歌曲信息。
(4)歌曲详情
在歌曲详情页展示歌曲信息、登录用户可对歌曲进行评分和收藏。系统根
据用户行为进行基于物品和基于用户的协同过滤推荐。

5.11音乐数据可视化模块
音乐数据可视化模块包含分类数量和评分的分析、导演评分词云图分析、年代音乐曲线、音乐分类占比图分析,使用Echarts可视化技术制作,一个音乐数据可视化模块可以包含以下分析和图表:

  1. 分类数量和评分的分析:可以使用柱状图或饼图来显示不同音乐分类的数量,同时在同一个图表中使用折线图或散点图来显示不同分类的平均评分,以便比较不同分类的数量和评分情况。
  2. 导演评分词云图分析:可以使用词云图来显示不同导演的评分情况,词云图中的词语大小表示导演的评分高低。这可以帮助用户快速了解哪些导演的音乐评分较高。
  3. 音乐年代曲线:可以使用折线图或面积图来显示不同年代的音乐数量变化情况,同时在同一个图表中使用折线图或散点图来显示不同年代的音乐平均评分变化情况,以便观察音乐产量和评分随时间的变化趋势。
  4. 音乐分类占比图分析:可以使用饼图或环形图来显示不同音乐分类在整体音乐数量中的占比情况,以便了解各个分类的相对重要性。这可以帮助用户了解哪些音乐分类的数量较多或较少。

5.4基于物品的音乐推荐功能
该以项目为基础的协同过滤方法有一个基本的假设“能够引起用户兴趣的项目,必定与其之前评分高的项目相似”,通过计算项目之间的相似性来代替用户之间的相似性。
具体步骤如下:第一步,收集用户信息。同以用户为基础(User-based)的
协同过滤。第二步,针对项目的最近邻搜索。先计算已评价项目和待预测项目的相似度,并以相似度作为权重,加权各已评价项目的分数,得到待预测项目的预测值。例如:要对项目 A 和项目 B 进行相似性计算,要先找出同时对 A 和 B 打过分的组合,对这些组合进行相似度计算。第三步,产生推荐结果。以项目为基础的协同过滤不用考虑用户间的差别,所以精度比较差。但是却不需要用户的历史数据,或是进行用户识别。对于项目来讲,它们之间的相似性要稳定很多,因此可以离线完成工作量最大的相似性计算步骤,从而降低了在线计算量,提高推荐效率,尤其是在用户多于项目的情形下尤为显著。
相似度计算

4、核心代码

# -*-coding:utf-8-*-importos os.environ["DJANGO_SETTINGS_MODULE"]="recomend.settings"importdjango django.setup()frommusic.modelsimport*frommathimportsqrt,powimportoperatorfromdjango.db.modelsimportSubquery,Q,Count# from django.shortcuts import render,render_to_responseclassUserCf:# 获得初始化数据def__init__(self,all_user):self.all_user=all_user# 通过用户名获得列表,仅调试使用defgetItems(self,username1,username2):returnself.all_user[username1],self.all_user[username2]# 计算两个用户的皮尔逊相关系数defpearson(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每项打分平方的累加formovie1,score1inuser1.items():ifmovie1inuser2.keys():# 计算公共的浏览次数n+=1sum_xy+=score1*user2[movie1]sum_x+=score1 sum_y+=user2[movie1]sumX2+=pow(score1,2)sumY2+=pow(user2[movie1],2)ifn==0:# print("p氏距离为0")return0molecule=sum_xy-(sum_x*sum_y)/n# 分子denominator=sqrt((sumX2-pow(sum_x,2)/n)*(sumY2-pow(sum_y,2)/n))# 分母ifdenominator==0:return0r=molecule/denominatorreturnr# 计算与当前用户的距离,获得最临近的用户defnearest_user(self,current_user,n=1):distances={}# 用户,相似度# 遍历整个数据集foruser,rate_setinself.all_user.items():# 非当前的用户ifuser!=current_user:distance=self.pearson(self.all_user[current_user],self.all_user[user])# 计算两个用户的相似度distances[user]=distance closest_distance=sorted(distances.items(),key=operator.itemgetter(1),reverse=True)# 最相似的N个用户print("closest user:",closest_distance[:n])returnclosest_distance[:n]# 给用户推荐音乐defrecommend(self,username,n=3):recommend={}nearest_user=self.nearest_user(username,n)foruser,scoreindict(nearest_user).items():# 最相近的n个用户formovies,scoresinself.all_user[user].items():# 推荐的用户的音乐列表ifmoviesnotinself.all_user[username].keys():# 当前username没有看过ifmoviesnotinrecommend.keys():# 添加到推荐列表中recommend[movies]=scores*score# 对推荐的结果按照音乐# 浏览次数排序returnsorted(recommend.items(),key=operator.itemgetter(1),reverse=True)# 基于用户的推荐defrecommend_by_user_id(user_id):user_prefer=UserTagPrefer.objects.filter(user_id=user_id).order_by('-score').values_list('tag_id',flat=True)current_user=User.objects.get(id=user_id)# 如果当前用户没有打分 则看是否选择过标签,选过的话,就从标签中找# 没有的话,就按照浏览度推荐15个ifcurrent_user.rate_set.count()==0:iflen(user_prefer)!=0:movie_list=Movie.objects.filter(tags__in=user_prefer)[:15]else:movie_list=Movie.objects.order_by("-num")[:15]returnmovie_list# 选取评分最多的10个用户users_rate=Rate.objects.values('user').annotate(mark_num=Count('user')).order_by('-mark_num')user_ids=[user_rate['user']foruser_rateinusers_rate]user_ids.append(user_id)users=User.objects.filter(id__in=user_ids)#users 为评分最多的10个用户all_user={}foruserinusers:rates=user.rate_set.all()#查出10名用户的数据rate={}# 用户有给音乐打分 在rate和all_user中进行设置ifrates:foriinrates:rate.setdefault(str(i.movie.id),i.mark)#填充音乐数据all_user.setdefault(user.username,rate)else:# 用户没有为音乐打过分,设为0all_user.setdefault(user.username,{})user_cf=UserCf(all_user=all_user)recommend_list=[each[0]foreachinuser_cf.recommend(current_user.username,15)]movie_list=list(Movie.objects.filter(id__in=recommend_list).order_by("-num")[:15])other_length=15-len(movie_list)ifother_length>0:fix_list=Movie.objects.filter(~Q(rate__user_id=user_id)).order_by('-collect')forfixinfix_list:iffixnotinmovie_list:movie_list.append(fix)iflen(movie_list)>=15:breakreturnmovie_list# 计算相似度defsimilarity(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()# 没有人给当前音乐打分ifmovie1_sum==0ormovie2_sum==0:return0similar_value=common/sqrt(movie1_sum*movie2_sum)#余弦计算相似度returnsimilar_value#基于物品defrecommend_by_item_id(user_id,k=15):# 前三的tag,用户评分前三的音乐user_prefer=UserTagPrefer.objects.filter(user_id=user_id).order_by('-score').values_list('tag_id',flat=True)user_prefer=list(user_prefer)[:3]print('user_prefer',user_prefer)current_user=User.objects.get(id=user_id)# 如果当前用户没有打分 则看是否选择过标签,选过的话,就从标签中找# 没有的话,就按照浏览度推荐15个ifcurrent_user.rate_set.count()==0:iflen(user_prefer)!=0:movie_list=Movie.objects.filter(tags__in=user_prefer)[:15]else:movie_list=Movie.objects.order_by("-num")[:15]print('from here')returnmovie_list# most_tags = Tags.objects.annotate(tags_sum=Count('name')).order_by('-tags_sum').filter(movie__rate__user_id=user_id).order_by('-tags_sum')# 选用户最喜欢的标签中的音乐,用户没看过的30部,对这30部音乐,计算距离最近un_watched=Movie.objects.filter(~Q(rate__user_id=user_id),tags__in=user_prefer).order_by('?')[:30]# 看过的音乐watched=Rate.objects.filter(user_id=user_id).values_list('movie_id','mark')distances=[]names=[]# 在未看过的音乐中找到forun_watched_movieinun_watched:forwatched_movieinwatched:ifun_watched_movienotinnames:names.append(un_watched_movie)distances.append((similarity(un_watched_movie.id,watched_movie[0])*watched_movie[1],un_watched_movie))#加入相似的音乐distances.sort(key=lambdax:x[0],reverse=True)print('this is distances',distances[:15])recommend_list=[]formark,movieindistances:iflen(recommend_list)>=k:breakifmovienotinrecommend_list:recommend_list.append(movie)# print('this is recommend list', recommend_list)# 如果得不到有效数量的推荐 按照未看过的音乐中的热度进行填充print('recommend list',recommend_list)returnrecommend_listif__name__=='__main__':# similarity(2003, 2008)print(recommend_by_item_id(1799))

5、源码获取方式

biyesheji0005 或 biyesheji0001 (绿色聊天软件)

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅

感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询