我有一个类似潘多拉(pandora)的软件,用户可以在其中竖起一首歌或竖起一首歌。这个名为Chavah的软件是Silverlight+C#,但这是一个与语言和平台无关的问题。
我的软件需要根据用户的喜好选择一首歌我需要一个好的算法。
我希望我的软件根据以下要求选择要播放的歌曲:
竖起大拇指的歌应该受欢迎,
经常玩。
未分级
歌曲(不向上或向下竖起拇指)
还是应该演奏的;毕竟,
用户总共只能有2个
竖起大拇指的歌。
翻唱的歌曲应该很少播放。
不管算法是什么,歌曲都不应该经常重复。
考虑到这些设计决策,这里是否有一些好的算法?
我有一些代码可以捕获所有歌曲、喜欢的歌曲和不喜欢的歌曲:
var allSongs = ...
var likedSongs = allSongs.Where(s => s.LikedByUser(...));
var dislikedSongs = allSongs.Where(s => s.DislikedByUser(...));
为用户挑选一首好歌有什么简单的想法吗?
最佳答案
你可以给歌曲加权重,比如说每首歌开头的分数是1.0,向下的是0.5,向上的是1.5。然后从所有的分数集合中选择一个随机元素,其概率由其权重加权我在这里想到的快速而肮脏的方法是把所有的重量相加选取一个小于该和的随机数。循环播放所有歌曲,直到currentweight+songweight>randomNumber(否则currentweight+=songweight)
当然,通过引入协作过滤,您可以任意地使这变得更复杂:)
想象五首歌。前两个拇指向上,下一个拇指向下,两个中立。
{1:1.5,2:1.5,3:0.5,4:1,5:1}
总数是5.5现在我们选择一个小于5.5的随机数,看:它是2.43789
现在让我们找到这个随机数所属的歌曲。
从currentweight=0开始。首歌的重量=1.5。currentweight+1.5我们继续,但是用这首歌的重量增加currentweight。
所以现在CurrentWeight=1.5下一首歌的重量:又是1.5。但现在,CurrentWeight+1.5==3>2.43789这意味着我们选择了第二首歌!
你在这里要做的基本上是在一行上随机选取一个点,但是增加该行上的“区域”,如果这首歌是竖起的话,它会选择一首歌。
这是否会产生很多重复基本上取决于你增加/减少歌曲重量的力度。