简易音乐推荐引擎的设计!

我们在浏览音乐网站时可能发现,它会自动给你推荐一些你感兴趣的音乐。这是怎么实现的呢?其实归根到底还是你在网站上留下了你的信息起了作用。比方说:你对你听过的音乐进行了评分,系统就会根据你对音乐的评分,然后再去参考其他用户的评分,通过后台的推荐引擎把数据归一化,提取出你可能会感兴趣的音乐。
在这里我们介绍下简易的音乐推荐引擎的实现思路,这个思路不光可以应用于音乐,当然也可以应用于商品,其实商品推荐的思想也是一样的。我们下面先介绍基于用户协作的方式
第一步构建数据集:
下面是我们构建的原始数据:
song={'枫之羽': {'夜曲': 2.5, '天意': 3.5,
'过火': 3.0, '天黑黑': 3.5, '倒带': 2.5, 
'红豆': 3.0},
'丫丫': {'夜曲': 3.0, '倒带': 3.5, 
'安静': 1.5, '后来': 5.0, '过火': 3.0, 
'听海': 3.5}, 
'tracy': {'夜曲': 2.5, '倒带': 3.0,
'灰色轨迹': 3.5, '后来': 4.0},
'小一': {'灰色轨迹': 3.5, '大城小爱': 3.0,
'夜曲': 4.5, '后来': 4.0, 
'天意': 2.5},
'猪猪': {'倒带': 3.0, '夜曲': 4.0, 
'安静': 2.0, '十年': 3.0, '过火': 3.0,
'听海': 2.0}, 
'小新': {'大城小爱': 3.0, '过火': 4.0,
'倒带r': 3.0, '天意': 5.0, '夜曲': 3.5},
'和棋': {'十年':4.5,'后来':1.0,'天意':4.0}}

 

这里接上一篇文章,这篇实现两个功能:第一:为不同的用户打分,获得这些用户与指定的用户具有相似性的用户列表。第二:实现推荐音乐
对于第一点其实就是用相关性的函数对每个人与特定用户进行评分,得到一长列表。
直接放代码:


#查找品味相同的N个人
def topMatches(prefs,user,n=5,similarity=sim_pearson):
    scores = [(similarity(prefs,user,other),other)
              for other in prefs if other!=user]
    scores.sort()
    scores.reverse()
    return scores[0:n]


对于第二点我们必须要一个经过加权的评价值来为音乐评分,评分者的评分结果因此会形成先后的排名,为此我们会要取得所有其他评论者的评分结果,借此得到相似度后,诚意他们为每首音乐所给的评分。为了考虑权重的影响,因此最后我们将歌的总计值初一所有其他人呢的相似度之和。
下面是代码


def getRecommendations(prefs,user,similarity=sim_pearson):
    totals={}
    simsums={}
    for other in prefs:
        #不要和自己作比较
        if other==user:
            continue
        sim = similarity(prefs,user,other)
        #忽略评价为0或者小于0的情况
        if sim <=0: continue
        for item in prefs[other]:
            #只对自己还未曾看过的影片进行评价
            if item not in prefs[user] or prefs[user][item] ==0:
                #相似度*评价值
                totals.setdefault(item,0)
                totals[item]+=prefs[other][item]*sim
                simsums.setdefault(item,0)
                simsums[item]+=sim
        #建立一个归一化的列表
        rankings = [(total/simsums[item],item) for item ,total in totals.items()]
        #返回经过排序的列表
        rankings.sort()
        rankings.reverse()
    return rankings


好了这里就能获得经过排名的音乐列表了,而且还推测出自己最有可能去听的音乐了,到这里这个简易的推荐引擎建立完毕。
PS:如果想获得浏览歌曲时获得相关歌曲的推荐,只要把数据集中的用户与歌曲之间互换,重新构造数据集。
这样就能得到每首歌曲之间的相似度了,然后取相似度最高的几首就是相关的歌曲了。
在阿里巴巴legend code程序设计大赛中有道类似的题目,大家可以发挥所长去尝试一次,而且还能下载到淘宝的数据
见网址:http://legendcode.alibaba-... 
这里介绍的方法是基于用户协作的过滤,大多数情况下面对用户数目庞大,而歌曲数目一般固定的情况下,应该采取物品协作的方式

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值