from random import seed,randrange # 模拟历史电影打分数据 seed(2050) data = {'user'+str(i):{'film'+str(randrange(1, 15)):randrange(1, 6) for j in range(randrange(3, 10))} for i in range(10)} #print(data) # 当前用户打分数据 user = {'film'+str(randrange(1, 15)):randrange(1,6) for i in range(5)} #print(user) # 基于用户的协同过滤算法原理: # 两个用户共同打分的电影最多,并且所有电影打分差值的平方和最小 f = lambda item:(-len(item[1].keys()&user), sum(((item[1].get(film)-user.get(film))**2 for film in user.keys()&item[1].keys()))) # 寻找最相似的用户及其对电影打分情况 similarUser, films = min(data.items(), key=f) #print(similarUser, films) print('known data'.center(50, '=')) print(data) 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, '=')) # 在当前用户没看过的电影中选择打分最高的进行推荐 recommended_film = max(films.keys() - user.keys(), key=films.get) # 创建GUI界面 root = tk.Tk() root.title("电影推荐系统") # 显示已有的电影数据 text1 = tk.Text(root, height=10, width=50) text1.insert(tk.END, "已有电影数据:\n") for u, f in data.items(): text1.insert(tk.END, "{}: {}\n".format(u, f)) text1.pack() # 显示当前用户的打分数据 text2 = tk.Text(root, height=5, width=50) text2.insert(tk.END, "当前用户打分数据:\n") text2.insert(tk.END, "{}\n".format(user)) text2.pack() # 显示最相似的用户及其对电影的打分情况 text3 = tk.Text(root, height=5, width=50) text3.insert(tk.END, "最相似的用户及其对电影的打分情况:\n") text3.insert(tk.END, "{}: {}\n".format(similarUser, films)) text3.pack() # 显示推荐的电影 text4 = tk.Text(root, height=5, width=50) text4.insert(tk.END, "推荐的电影:\n") text4.insert(tk.END, "{}\n".format(recommended_film))text4.pack() root.mainloop() 以上代码的效果分析
时间: 2024-02-19 18:02:10 浏览: 109
基于python+CNN+MLP实现的电影数据爬取及评分预测项目源码+数据集+项目说明.zip
这段代码实现了一个基于用户的协同过滤算法的电影推荐系统,并且使用了 Python 的 tkinter 库实现了一个简单的图形用户界面(GUI)。具体实现流程如下:
1. 首先使用 random 库生成了一些用户历史电影打分数据,这些数据被存储在一个嵌套字典 data 中。
2. 然后生成了一个当前用户的电影打分数据,存储在字典 user 中。
3. 接着定义了一个 lambda 函数 f,用于计算用户之间的相似度。该函数首先计算两个用户共同打分的电影数量,然后计算这些电影打分差值的平方和,最终返回一个元组 (-len(item[1].keys()&user), sum(((item[1].get(film)-user.get(film))**2 for film in user.keys()&item[1].keys()))),其中元组的第一个值表示共同打分电影数量的相反数,第二个值表示打分差值平方和。
4. 使用 min 函数遍历 data 中的所有用户,找到与当前用户最相似的用户及其对电影的打分情况,存储在 similarUser 和 films 中。
5. 找到当前用户没看过的电影中打分最高的电影,作为推荐的电影,存储在 recommended_film 变量中。
6. 使用 tkinter 库实现了一个简单的图形用户界面,包括四个文本框,分别显示已有的电影数据、当前用户打分数据、最相似的用户及其对电影的打分情况以及推荐的电影。
7. 最后调用主循环函数 root.mainloop(),启动 GUI 界面。
通过这个推荐系统,用户可以输入自己的打分数据,系统会自动找到与其口味相似的用户,并推荐相应的电影。
阅读全文