news 2026/4/18 1:00:46

Python音乐推荐系统:Django+基于用户协同过滤(余弦相似度算法)源码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python音乐推荐系统:Django+基于用户协同过滤(余弦相似度算法)源码

python音乐推荐系统 音乐推荐系统源码 技术栈:python+django+基于用户协同过滤,应用余弦相似度 推荐思路:用户登陆系统后,听歌时会记录听歌次数,听歌的次数可以代表用户对歌曲的喜好度,一次一分,最高10分,有了记录后再应用余弦公司计算用户相似度,得到相似度矩阵,在通过相似度矩阵*用户评分矩阵得到推荐分数矩阵,按分数高低排序推荐

打开音乐App时总能看到那些"猜你喜欢"的歌单,有些推荐准得让人怀疑手机被监听了。今天咱们自己动手撸个推荐系统,用Python+Django实现基于用户的协同过滤算法,看看这背后的魔法是怎么变出来的。

先看核心数据模型设计。在models.py里咱们得记录三样东西:用户、歌曲、用户行为。代码比文字更直观:

from django.db import models class User(models.Model): username = models.CharField(max_length=50, unique=True) class Song(models.Model): title = models.CharField(max_length=200) artist = models.CharField(max_length=100) # 音频文件路径等字段... class UserPlayHistory(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) song = models.ForeignKey(Song, on_delete=models.CASCADE) play_count = models.IntegerField(default=0) # 用Decimal类型存评分更精确 score = models.DecimalField(max_digits=3, decimal_places=1, default=0.0) class Meta: unique_together = ('user', 'song') # 防止重复记录

用户每次播放歌曲时,咱们得更新这个评分系统。注意这里有个小技巧:播放次数转评分时做了0-10分的限制,防止数据偏差过大。看看视图层怎么处理:

def record_play(request, song_id): user = request.user song = Song.objects.get(id=song_id) history, created = UserPlayHistory.objects.get_or_create( user=user, song=song ) # 播放次数+1,但不超过10次 history.play_count = min(history.play_count + 1, 10) # 直接按播放次数作为评分 history.score = history.play_count history.save() return JsonResponse({'status': 'success'})

接下来是重头戏——相似度计算。咱们用余弦相似度来衡量用户口味有多接近。别被数学名词吓到,本质上就是比较两个用户的评分向量夹角:

from collections import defaultdict from decimal import Decimal import math def cosine_similarity(user1, user2): # 获取共同评分的歌曲 common_songs = set(user1.play_history.values_list('song', flat=True)) & \ set(user2.play_history.values_list('song', flat=True)) if not common_songs: return 0.0 # 计算点积和模长 dot_product = 0 magnitude1 = 0 magnitude2 = 0 for song in common_songs: score1 = UserPlayHistory.objects.get(user=user1, song=song).score score2 = UserPlayHistory.objects.get(user=user2, song=song).score dot_product += float(score1 * score2) magnitude1 += float(score1 ** 2) magnitude2 += float(score2 ** 2) magnitude = math.sqrt(magnitude1) * math.sqrt(magnitude2) return Decimal(dot_product / magnitude) if magnitude else 0.0

这里有个性能优化点:实际生产环境应该批量查询而不是循环内查数据库,但示例代码保持简洁优先。缓存用户评分数据能显著提升速度。

最后是推荐算法本体,这步相当于把相似用户的喜好"借"过来:

def generate_recommendations(user, top_n=10): all_users = User.objects.exclude(id=user.id) similarity_cache = {} # 缓存相似度计算结果 # 构建评分预测字典 recommendations = defaultdict(float) for other_user in all_users: # 相似度超过0.7才考虑 sim = cosine_similarity(user, other_user) if sim < 0.7: continue # 遍历相似用户听过的歌 for history in other_user.play_history.all(): if not user.play_history.filter(song=history.song).exists(): # 加权评分累加 recommendations[history.song] += float(sim * history.score) # 按评分排序取TopN sorted_songs = sorted(recommendations.items(), key=lambda x: x[1], reverse=True)[:top_n] return [song for song, _ in sorted_songs]

在前端展示推荐结果时,用Django模板引擎循环输出即可。注意要排除用户已经听过的歌曲,这个过滤逻辑在模板里可以直接处理:

<div class="recommend-box"> <h3>根据您的口味推荐</h3> <ul> {% for song in recommended_songs %} {% if song not in played_songs %} <li>{{ song.title }} - {{ song.artist }}</li> {% endif %} {% endfor %} </ul> </div>

这个系统在实际使用时会遇到冷启动问题——新用户没数据时怎么推荐?可以准备个热门歌曲榜单作为兜底方案。另一个要注意的是数据稀疏性,当用户量增大时需要考虑降维处理,或者改用矩阵分解等更高效的方法。但作为入门级的协同过滤实现,这个版本已经能展现推荐系统的核心逻辑了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 12:55:59

Java毕设项目推荐-基于springboot的乡村茶企 / 茶农乡村茶产品管理系统设计与实现库存管理、产品溯源【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/17 14:16:19

为什么顶尖团队开始转向Open-AutoGLM?:深度剖析其超越OpenAI的3大优势

第一章&#xff1a;Shell脚本的基本语法和命令Shell脚本是Linux/Unix系统中自动化任务的核心工具&#xff0c;通过编写可执行的文本文件&#xff0c;用户能够组合命令、控制流程并处理数据。编写Shell脚本通常以指定解释器开头&#xff0c;最常见的是Bash。脚本起始与执行权限 …

作者头像 李华
网站建设 2026/3/24 2:45:59

Java计算机毕设之基于springboot的湄潭县乡村茶产品管理系统设计与实现茶叶种植溯源、产品展示、订单管理、品牌推广、电商销售(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/17 14:27:49

Java毕设项目:基于springboot的湄潭县乡村茶产品管理系统设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/9 23:16:32

Open-AutoGLM苹果可以用么:3大实测方法+兼容性分析,Mac用户必看

第一章&#xff1a;Open-AutoGLM苹果可以用么Open-AutoGLM 是一个基于 AutoGLM 架构的开源项目&#xff0c;旨在为开发者提供轻量化的语言模型推理能力。尽管该项目并非由苹果官方推出&#xff0c;但其设计兼容多种硬件平台&#xff0c;包括搭载 Apple Silicon 芯片&#xff08…

作者头像 李华
网站建设 2026/4/14 11:45:58

Open-AutoGLM性能优化全攻略(99%的人都忽略的3个细节)

第一章&#xff1a;Open-AutoGLM 完全指南Open-AutoGLM 是一个开源的自动化通用语言模型&#xff08;GLM&#xff09;部署与推理框架&#xff0c;专为高效集成、调优和扩展 GLM 系列模型而设计。它支持多平台部署、自动量化、API 服务封装以及可视化监控&#xff0c;适用于从研…

作者头像 李华