数据结构与算法笔记:高级篇 - 向量空间:如何实现一个简单的音乐推荐系统?

概述

很多人喜都喜爱听歌,以前我们用 MP3 听歌,现在直接通过音乐 App 在线就能听歌。而且,各种音乐 App 的功能越来越强大,不仅可以自己选歌听,还可以根据你听歌的喜好,给你推荐你可能会喜好的音乐,而且有时候推荐的音乐还非常适合你的口味,甚至会经验到你!如此智能的一个功能,你知道它是怎么实现的吗?


算法解析

实际上,要解决这个问题,并不需要特别高深的理论。解决思路的核心思想非常简单、直白,用两句话就能概括出来。

  • 找到跟你口味偏好相似的用户,把他们爱听的歌曲推荐给你;
  • 找出跟你喜爱的歌曲特征相似的歌曲,把这些歌曲推荐给你。

接下来,我们就分别讲解一下这两种思路的实现方式。

1.基于相似用户做推荐

如何找到跟你口味偏好相似的用户呢?或者说如何定义口味偏好相似呢?实际上,思路也非常简单,我们把跟你听类似歌曲的人,看做口味相似的用户。你可以看下面这个图。用 “1” 表示 “喜爱”,用 “0” 笼统的表示 “不发表意见”。从图中可以看出,你跟小明共同喜爱的歌曲最多,有 5 首。于是,我们就可以说,小明跟你的口味非常相似。

在这里插入图片描述

我们只需要遍历所有的用户,对比每个用户跟你共同喜爱的歌曲个数,并设置一个阈值,如果你和某个用户共同喜爱的歌曲个数超过这个阈值,我们就把这个用户看做跟你口味相似的用户,把这个用户喜爱但你还没有听过的歌曲,推荐给你。

不过,刚刚的方案中有一个问题,我们如何知道用户喜爱那首歌曲呢?也就是说,如何定义用户对某首歌曲的喜爱程度呢?

实际上,我们可以通过用户的行为,来定义这个喜爱程度。我们给每个行为定义一个得分,得分越高表示越喜爱。

在这里插入图片描述

还是刚刚那个里子,我们如何把每个人对每首歌曲的喜爱程度表示出来,就是下面这个样子。图中,某个人对某首歌曲是否喜爱,我们不再用 “1” 或者 “0” 来表示,而是对应一个具体的分值。

在这里插入图片描述

看了这样一个用户对歌曲的喜爱程度的对应表之后,如何来判断两个用户是否口味相似呢?

显然,不能再像之前那样,采用简单的计数来统计两个用户之间的相似度。还记得我们之前讲字符串的相似度度量时,提到的编辑距离吗?这里的相似度度量,我们可以用另外一个距离,那就是欧几里得距离(Euclidean distance)。欧几里得距离是用来计算两个向量之间的距离的。这个概念中有两个关键词,向量和距离,我来给你解释下。

一维空间是一条线,我们用 1,2,3... 这样单个的数,来表示一维空间中的某个位置;二维空间是一个面,我们用 (1,3), (4,2), (2,2) ... 这样的两个数,来表示二维空间中的某个位置;三维空间是一个立体空间,我们用 (1,3,5), (3,1,7), (2,4,3) ... 这样的三个数,来表示三维空间中的某个位置。一维、二维、三维应该都不难理解,那更高维中的某个位置该如何表示呢?

类比 一维、二维、三维的表示方法,K 维空间中的某个位置,我们可以写作 ( X 1 , X 2 , X 3 , . . . , X k ) (X_1, X_2, X_3,..., X_k) (X1,X2,X3,...,Xk)。这种表示方法就是向量(vector)。我们知道,二维、三维空间中,两个位置之间有距离的概念,类比到高维空间,同样也有距离的概念,这就是我们说的两个向量之间的距离。

那如何计算两个向量之间的距离呢?我们还是可以类比到二维、三维中距离的计算方法。通过类比,我们就可以得到两个向量之间距离的计算公式。这个计算公式就是欧几里得距离的计算公式:

在这里插入图片描述

把每个用户对所有歌曲的喜爱程度,都用一个向量表示。我们计算出两个向量之间的欧几里得距离,作为两个用户的口味相似程度的度量。从图中的计算可以看出,小明与你的欧几里得距离最小,也就是说,你俩在高维空间中靠的最近,所以,我们就可以断定,小明跟你的口味最相似。

在这里插入图片描述

2.基于相似歌曲推荐

刚刚讲了基于相似用户的歌曲推荐方法,但是,如果用户是一个新用户,我们还没有收集到足够多的行为数据,这个时候该如何推荐呢?我们现在再来看另一种推荐方法,基于相似歌曲的推荐方法,也就是说,如果某首歌曲跟你喜爱的歌曲类似,我们就把它推荐给你。

如何判断两首歌曲是否相似呢?对于人来说,这个事情可能会比较简单,但是对于计算机来说,判断两个歌曲是否相似,那就需要通过量化的数据来表示了。我们应该通过什么数据量化两个歌曲之间的相似程度呢?

最容易想到的是,我们对歌曲定义一些特征项,比如是伤感的还是愉快的,时摇滚还是民谣,是柔和还是高亢的等等。类似基于相似用户的推荐方法,我们给每个歌曲的每个特征项打一个分数,这样每个歌曲就都对应一个特征项向量。我们可以基于 这个特征项向量,来计算两个歌曲之间的欧几里得距离。欧几里得距离越小,表示两个歌曲的相似程度越大。

但是,要实现这个方案,需要有一个前提,那就是我们能够找到足够多,并且能够全面代表歌曲特点的特征项,此外,我们还要人工给每首歌标注每个特征项的得分。对于收录量海量歌曲的音乐 App 来说,这显然是一个非常大的工程。此外,人工标注有很大的主观性,也会影响到推荐的准确性。

既然基于歌曲特征项计算相似度不可行,那我们就换一种思路。对于两首歌,如果喜欢的人群都是差不多的,那侧面就可以反映出,这两首歌比较相似。如图所示,每个用户对歌曲有不同的喜爱程度,我们依旧通过上一个解决方案中定义的得分标准,来定义喜爱程度。

在这里插入图片描述

你有没有发现,这个图跟基于相似用户推荐中的图几乎一样。只不过这里把歌曲和用户的主次颠倒了一下。

  • 基于相似用户的推荐方法中,针对每个用户,我们将对各个歌曲的喜爱程度作为向量。
  • 基于相似歌曲的推荐思路中,针对每个歌曲,我们将每个用户的打分作为向量。

有了每个歌曲的向量表示,我们通过计算向量之间的欧几里得距离,来表示歌曲之间的相似度。欧几里得距离距离越小,表示两个歌曲越相似。然后,我们在用户已经听过的歌曲中,找出他喜爱程度较高的歌曲。然后,我们找出跟这些歌曲相似度很高的其他歌曲推荐给他。

总结

实际上,这个问题是推荐系统(Recomendation System)里最典型的一类问题。之所以讲这部分内容,主要还是给你展示,算法的强大之处,利用简单的向量空间的欧几里得距离,就能解决如此复杂的问题。不过,本章只讲解了基础理论,实践中遇到的问题还有很多,比如冷启动问题,产品初期积累的数据不多,不足以做推荐等等。这些更加深奥的内容,你可以之后自己在实践中慢慢探索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/36210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第49课-机器人自动跳舞

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第49课-机器人自动跳舞 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…

DevExpress Office File API教程 - 如何使用AI服务增强Word文档可访问性和语言支持?

DevExpress Office File API是一个专为C#, VB.NET 和 ASP.NET等开发人员提供的非可视化.NET库。有了这个库,不用安装Microsoft Office,就可以完全自动处理Excel、Word等文档。开发人员使用一个非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…

使用隐式事件执行控制图

什么是隐式事件? 隐式事件是图表执行时发生的内置事件: 图表唤醒 进入一个状态 退出状态 分配给内部数据对象的值 这些事件是隐式的,因为您没有显式地定义或触发它们。隐式事件是它们发生的图表的子级,仅在父图表中可见。 隐式事…

【AI生成】海上风电中卫星网络与无线自组网的应用分析

随着可再生能源的不断发展,海上风电作为其中的重要组成部分,在我国能源结构调整中占据越来越重要的地位。近年来,我国海上风电产业发展迅速,海上风电场数量和规模不断扩大,相应地,海上风电运维和安全保障的…

git branch -a 不显示远程分支修复

使用git remote -v命令&#xff0c;查看所有的远程仓库及其URL如果没有&#xff0c;说明没有远程仓库&#xff0c;继续往下走使用git remote add origin <url>命令来添加或修改远程仓库&#xff1a;其中<url>是远程仓库的正确URL&#xff0c;就是git项目的http的地…

实现Java中的图像处理功能

实现Java中的图像处理功能 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在本篇文章中&#xff0c;我们将探讨如何在Java中实现图像处理功能。图像处理是计算机…

Embedding的概念和展开

前言 本章&#xff0c;我们介绍一个非常细的细节技术。让我们微调大模型的一些特性和能力。 在大模型的AI套路演化过程中&#xff0c;其实经历了太多的技术革新和方式变化&#xff0c;Embedding其实也可能是其中一个高速湮灭的技术点之一。 对比LoRA现在大红大紫&#xff0c…

每个 Node.js 开发人员都应该知道的13个库(下)

7. Sequelize Mongoose是一个Node。基于js的MongoDB对象建模工具&#xff0c;通常被称为对象数据建模&#xff08;ODM&#xff09;库&#xff0c;它提供了诸如钩子、模型验证、连接和查询等功能。 Mongoose为应用程序数据提供了一个基于模式的解决方案&#xff0c;它在应用程…

【JavaScript脚本宇宙】玩转数据存储:深入剖析提升 Web 应用程序性能的六大利器

从本地到云端&#xff1a;全面解析满足各种需求的高性能 JavaScript 数据库库 前言 本文将介绍几个流行的JavaScript数据库库&#xff0c;包括localForage、Dexie.js、PouchDB、LokiJS和NeDB。每个库都有自己的特点和适用场景。通过比较它们的功能和使用方式&#xff0c;可以…

论文翻译 | ITER-RETGEN:利用迭代检索生成协同增强检索增强的大型语言模型

论文地址&#xff1a;Enhancing Retrieval-Augmented Large Language Models with Iterative Retrieval-Generation Synergy 摘要 检索增强生成由于有望解决包括过时知识和幻觉在内的大型语言模型的局限性而引起广泛关注。然而&#xff0c;检索器很难捕捉相关性&#xff0c;尤…

BurpSuite2024.5.3专业版,仅支持Java21以上

01更新介绍 此版本引入了对 WebSocket 的 Burp Scanner 支持、对录制的登录编辑器的改进、WebSocket 匹配和替换规则以及许多性能改进。我们还删除了一些冗余的扫描检查。 Burp Scanner 对 WebSockets 的支持我们更新了内部代理的配置&#xff0c;以允许 WebSocket 流量。这使…

代码随想录算法训练营第五十一天| 115.不同的子序列、583. 两个字符串的删除操作、 72. 编辑距离

LeetCode 115.不同的子序列 题目链接&#xff1a;https://leetcode.cn/problems/distinct-subsequences/description/ 文章链接&#xff1a;https://programmercarl.com/0115.%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AD%90%E5%BA%8F%E5%88%97.html 思路 * dp[i][j]&#xff1a;以i-1…

Docker快速极简配置nginx实现不同域名访问分流

文章目录 前言安装配置使用镜像拉取及环境配置修改代理文件编写docker-compose文件启动nginx代理 总结 前言 本文主要记录如何使用docker安装配置Nginx&#xff0c;如何使用Nginx把通过80、443端口访问的请求根据域名分发到不同端口。那么什么是Nginx呢&#xff0c;下边做个简…

将产品制作成3D模型在网站上展示需要多少费用?

将产品制作成3D模型并在网站上展示的费用会因多种因素而异&#xff0c;包括模型的复杂度、所需的细节程度、制作3D模型的软件和工具、以及是否需要专业设计师的服务等。此外&#xff0c;不同的3D模型制作服务提供商可能会有不同的定价标准。 如果能自己制作3D模型&#xff0c;…

友力科技IDC机房搬迁方案流程分享

机房搬迁流程 系统搬迁实施流程包括&#xff1a;准备、拆卸、装运、安装、调试等五个流程&#xff0c;具体如下&#xff1a; 准备:包括相关人员和设备准备、新机房环境准备、网络环境、备份、现场所有设备打标签、模块、设备准备等准备工作。拆卸&#xff1a;主要只核心设备下…

iptables(2)安装及规则查询

安装iptables 我是用的系统是debian 12,目前没有安装iptables。 防火墙已经安装完成了 iptables 的配置语法 iptables (选项) (参数) # 通用匹配:源地址目标地址的匹配 -p:指定要匹配的数据包协议类型 -s, --source [!] address[/mask] :把指定的一个/一组地址作为源地…

防坑知识:如果要查自己的大数据信用报告,这几种平台一定不要选!

很多小伙伴在候遇到申贷碰壁&#xff0c;特别是被告知原因是大数据不良之后&#xff0c;都急着去了解自己的大数据信用情况&#xff0c;常见的方式就是在百度搜索大数据信用&#xff0c;大数据报告查询&#xff0c;哪里能查大数据信用等关键词&#xff0c;随便找一个地方就去查…

Python 中处理大量用户阅读历史数据的策略

Python 中处理大量用户阅读历史数据的策略 处理大量数据时&#xff0c;效率和性能成为关键考虑因素。Python 提供了一系列工具和技术&#xff0c;可以帮助我们高效地处理大数据集。以下是一些处理大量用户阅读历史数据的策略。 1. 使用合适的数据存储解决方案 对于大规模数据…

【深度C++】之“目录”

0. 关于【深度C】 2023年5月&#xff0c;看了一个月《C Primer&#xff08;第5版&#xff09;》的我&#xff0c;感觉很“头疼”。 虽然看了很多&#xff0c;但是并没有组织在一起。仿佛一个有很多线头的毛线团&#xff0c;无从整理。 比如一口气让你说出const的用法&#x…

不常见的逻辑漏洞

文章目录 1. 逻辑漏洞2. 理赔类逻辑漏洞3. 支付类漏洞3.1 超时未发货商品赔付漏洞3.2 骗取某宝运费险漏洞 4. 批量注册场景5. 享受特权用户功能6. 社交类型场景7. 购物类型场景8. 签约漏洞场景 1. 逻辑漏洞 逻辑漏洞不可以用扫描器去扫&#xff0c;漏洞&#xff0c;就是由于开发…