听豆瓣电台引发的感想

2023-10-17 18:32
文章标签 引发 豆瓣 感想 电台

本文主要是介绍听豆瓣电台引发的感想,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作为一名ACMer,天天接触算法,对生活中许多用到算法的地方都会变得敏感,本人听歌喜欢听豆瓣电台,之前对这个音乐网的私人兆赫这一块不是很在意,只到打了不少红心歌和不喜欢听的歌之后,再一次打开私人兆赫,发现私人兆赫里放的歌居然真的开始合我心意,甚至找出了不少我以前只因喜欢其中某个调却一直找不到的歌,故搜查网络上关于豆瓣网的信息,感觉这篇文章写得挺好的。


叶伟说:“我也很少收藏豆列的,都是直接点红心,我点了很多红心,也点了很多不再播放,但私人电台里还是很多不喜欢的歌。”我有同感。这个产品是不是已经停止进化了。

 

本来应该是另一个“不便回答”的问题。但有人盛情邀请,所以稍微说一下。豆瓣电台的私人电台会综合用户在豆瓣上的各种音乐行为做算法推荐。当然考虑最多的是电台本身的“红心”, “垃圾”, “跳过”这些数据。

至于算法本身,在任何领域里,超出基本的普通推荐算法之后,就没有“亢龙有悔”一招打遍天下的东西。可以说全是细节。这个是不断积累、观察、学习、创造的过程,而且每天在持续变化。做推荐是在一条没有终结的马路上一边攒车一边开车,教科书、论文里的东西都是基本的零件,中间碰到各种奇奇怪怪的算法都可能被捡起来装到车上。Swiss army knife, yes.  Silver bullet, no.

1)豆瓣会计算和每首歌近似的歌曲集合,这个可以基于“用户歌曲矩阵”的传统方法,并依次作为核心数据,这个核心数据的更新频率并不需要很高。
2)豆瓣会为每个用户维护一个线性的播放列表。
3)每当用户对一首歌曲给出正向反馈,系统会取出与这首歌相似的歌曲列表中的几首,插入用户当前的播放列表。
4)如果一个用户给出负向反馈,系统会从这个列表中删除那些与这首歌相关性高的歌曲。(这一点有一些工作可以做,例如是删除同一个歌手的歌曲呢?还是曲风呢?或者是基于之前的核心库的相似歌曲列表呢?)
2011年05月04日,补充了一些豆瓣电台的策略:
1. 豆瓣实现了自更新模块,主要依赖于内部的自动配置协议,能够动态的配置新算法或者一个算法的参数,同时分配一定比例的用户给一个新的推荐模块(也就是动态AB测试)。在进行评测之后,再自动的进行调整。
2. 用户行文建模:豆瓣对一些典型的用户行为进行了特殊建模,如一些连续点击喜欢或者不喜欢的用户。
3. 时间因素:豆瓣似乎会根据当前的时间来推荐不同的歌曲,例如在工作时间会倾向于推荐一些较为柔和的歌曲。
4. 歌曲标签:豆瓣的歌曲会被打上标签,从而为推荐提供辅助信息。
5. 用户聚类:豆瓣似乎使用了一些用户聚类的算法来提高算法的效率。

-----------------------------------------------------------
2011年03月11日,一些猜测:

豆瓣的电台应该分成三部分:
1. 一部分是根据你的social行为推荐的音乐,例如你打分的专辑,你加入的标签等等。
2. 另外一部分是根据你使用电台的行为推荐的音乐列表,这个估计是基于user-based或者item-based来计算的,数据就是喜欢、不喜欢和跳过。
3. 第三部分应该是通过编辑加入的歌曲,例如在特定的时期对特定的人群发送特定的歌曲(一个例子是在大年初一听到的第一首歌是新年祝福相关的)

虽然只是这三部分,但是第一部分和第二部分会引入很多的参数,于是又有了一层算法:参数调优。这里有三种实现形式:所有用户用同一组参数;每个用户用不同的参数;先把用户聚类,然后每类用户用一组参数。

这里的参数也会有很多种,一个关键在于比例的配置。例如,我们有15个源来产生推荐的歌曲,如何才能混合这些歌曲才能取得用户最大的满意度。理想情况是要同时考虑熟悉度、多样度、和惊奇度。在具体算法中也有选择多少个相似用户、每个用户对最终结果的影响度是多少、贡献的数量是多少。再有就是如何从用户听过的成百上千的歌曲中选择一个子集来进行后续的运算。当然,虽然这么说,但是千万不要让自己陷入其中,最重要是找到一个简约的方案来调优。

除此之外,不知道豆瓣可能还有另外一层的算法,就是即使给一个用户准备好了一堆可以推荐的歌曲,应该按照什么顺序来播放给用户。这一点也能说出很多复杂的需要考虑的因素,我们在设计的时候也不要陷入在细节中,而应该找出最关键的几点来撬动这个石头:)

最后,豆瓣也应该有个过滤的前端,会根据大家对一首歌的整体评分来决定后续推荐的音乐集合


这篇关于听豆瓣电台引发的感想的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/227198

相关文章

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

初步学习Android的感想

之前在学习java语言的时候就经常听说过Android这门语言,那时候感觉Android有些神秘感,再加上Android是用来开发移动设备的一门语言,所以一直对Android抱有一种兴奋的心情。 在我开始接触 Android之后,感觉超好玩,因为可以在自己的手机设备上开发一些我喜欢的小应用,再想想之前说学习Android应该会很难,但是如果你真的接触了,而且有JAVA的功底,我想学习Androi

一道算法题引发的动态内存管理的思考

在做PKU2762时,需要建邻接表。 于是按部就班写了下面一个插入边到邻接表中的函数: const int VMAX = 1010;typedef struct Graph{int vex;Graph* next;}Graph;Graph ArcGraph[VMAX];void insert(int u, int v){Graph* t = new Graph;Graph*

引发蛀牙、避免蛀牙食物大全

引发蛀牙、避免蛀牙食物大全 引发蛀牙的食物大全: 糖果 糖浆 糖果棒 巧克力 碳酸饮料 果汁 口香糖 蜂蜜 蛋糕 甜点 薯片 脆饼干 果酱 果冻 蜜饯 蜜饯果干 避免蛀牙的食物大全: 高纤维蔬菜 水果 坚果 种子 高钙乳制品 高蛋白质肉类 高蛋白质鱼类 绿茶 水 蔬菜汤 鸡汤 酸奶 酸奶制品 奶酪 红薯 土豆 面包和全麦面包 芝士

捉虫笔记(四)-- 空格引发的悬案

空格引发的悬案 1、描述现象: 在代码中有一段利用rmdir指令删除目录代码,但是有用户反馈一直删除失败,但是有没有看到错误的日志信息,正好有同事能复现,所以今天好好探究一番。 2、思考过程 很好奇的一点就是为什么有的环境就是正常。 首先想到2个问题: ①代码有没有执行。 ②假如执行,有没有错误。 关于这两个问题都有个难点,我该如何下断点: 2.1、分析代码是否执行 删除目录的

“苹果税”引发的苹果与腾讯、字节跳动之间的纷争与博弈

北京时间9月10日凌晨一点的Apple特别活动日渐临近,苹果这次将会带来iPhone16系列新品手机及其他硬件产品的更新,包括iPad、Apple Watch、AirPods等。从特别活动的宣传图和宣传标语“閃亮時刻”来看,Apple Intelligence将会是史上首次推出,无疑将会是iOS 18的重头戏和高光时刻。 不过就在9月2日,一则“微信可能不支持iPhone16”的

爬虫二:获取豆瓣电影Top250(Requests+XPath+CSV)

描述: 在上一篇获取豆瓣图书Top250的基础上,获取豆瓣电影Top250的数据并将结果写入CSV文件中。 代码: # -*- coding: UTF-8 -*-import requestsfrom lxml import etreeimport timeimport csv# 从网页上获取电影数据moviedata = []count = 0for i in range(1

爬虫一:获取豆瓣图书Top250(Requests+XPath)

目的: 获取豆瓣图书Top250的所有书目信息。 豆瓣网址:https://book.douban.com/top250 代码: import requestsfrom lxml import etreeimport timefor i in range(10):url = 'https://book.douban.com/top250?start=' + str(25*i)data

系统开发心得感想

系统总结 到现在也是写了几个小系统了图书管理,通讯录,atm。也有着不小的收获,对系统开发多少是有了点认识。 1.首先需要将大体的类和每个类所要实现的功能构思一下然后将其以用大体的代码写出来不需要实现只要把函数名写出来明白每个函数之间的功能,用什么容器来存储操作数据如何才能使代码更加简洁,以及做好类之间的联系(数据文件的存写保证数据的准确性)。 然后整理思路按顺序将具体的代码写出来每个函数功能怎样

Navicat导入时由分号引发的诡异问题

最近在将第三方提供的一个sql导入到自己的数据库的时候,(Event部分的脚本)总是提示错误: [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near