(董付国)Python 学习笔记---Python序列(4)

字典应用案例

  • 已有大量用户对若干电影的打分数据,现有某用户,也看过一些电影并进行过评分,要求根据已有打分数据为该用户进行推荐。

    1.代码采用基于用户的过滤协同算法,也就是根据用户喜好来确定与当前用户最相似的用户,然后再根据最相似用户的喜好为当前用户进行推荐。
    2.代码采用字典来存放数据,格式为{用户1:{电影名称1:打分1,电影名称2:打分2,…},用户2:{…}}。

from random import randrange

#历史电影打分数据
data = {'user'+str(i):{'film'+str(randrange(1,15)):randrange(1,6)
                                 for j in range(randrange(3,10))}
        for i in range(10)}

#当前用户打分数据
user = {'film'+str(randrange(1,15)):randrange(1,6) for i in range(5)}

#最相似的用户及其对电影打分情况
#两个用户共同打分的电影最多
#并且所有电影打分差值的平方和最小
similarUser,films = min(data.items(),
                        key = lambda item:(-len(item[1].keys()&user),
                                           sum(((item[1].get(film)-user.get(film))**2
                                           for film in user.keys()&item[1].keys()))))
print('konwn data'.center(50,'='))
for item in data.items():
    print(len(item[1].keys()),
          sum(((item[1].get(film)-user.get(film))**2
               for film in user.keys()&item[1].keys())),
          item,
          sep=':')
print('current user'.center(50,'='))
print(user)
print('most similar user and his films'.center(50,'='))
print(similarUser,films,sep=':')
print('recommended film'.center(50,'='))
#在当前用户没看过的电影中选择打分最高的进行推荐
print(max(films.keys()-user.keys(),key = lambda film:films[film]))

运行结果(随机):

====================konwn data====================
6:1:('user0', {'film14': 5, 'film7': 4, 'film9': 3, 'film8': 1, 'film10': 5, 'film2': 4})
7:9:('user1', {'film4': 2, 'film13': 1, 'film8': 3, 'film3': 1, 'film10': 5, 'film7': 5, 'film2': 2})
6:17:('user2', {'film7': 4, 'film12': 5, 'film8': 2, 'film9': 2, 'film3': 3, 'film11': 1})
4:0:('user3', {'film3': 3, 'film6': 1, 'film7': 3, 'film13': 5})
7:0:('user4', {'film3': 5, 'film1': 4, 'film9': 1, 'film6': 2, 'film14': 4, 'film13': 1, 'film12': 2})
3:13:('user5', {'film2': 1, 'film12': 1, 'film11': 3})
7:16:('user6', {'film14': 1, 'film4': 5, 'film12': 4, 'film6': 4, 'film3': 5, 'film1': 3, 'film13': 1})
2:0:('user7', {'film10': 1, 'film14': 3})
3:0:('user8', {'film9': 2, 'film3': 3, 'film8': 4})
6:0:('user9', {'film4': 1, 'film8': 1, 'film7': 3, 'film13': 5, 'film12': 4, 'film10': 1})
===================current user===================
{'film11': 5, 'film4': 1, 'film5': 1, 'film7': 3, 'film2': 4}
=========most similar user and his films==========
user1:{'film4': 2, 'film13': 1, 'film8': 3, 'film3': 1, 'film10': 5, 'film7': 5, 'film2': 2}
=================recommended film=================
film10
posted @ 2019-08-08 19:23  旅人_Eric  阅读(233)  评论(0编辑  收藏  举报