接上一篇
转自:https://blog.csdn.net/u012995888/article/details/79077681
原文用java实现,想看详细介绍的请跳原文
链接:https://blog.csdn.net/u012995888/article/details/79077681
数据格式可以自行修改,用其它方式存储更方便
直接上代码(基于物品的协同过滤)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
@Time : 2018/9/17 9:32
@Author : Negen
@Site :
@File : recommend3.py
@Software: PyCharm
'''
import numpy as np
users = ["小明", "小花", "小美", "小张", "小李"]
movies = ["电影1", "电影2", "电影3", "电影4", "电影5", "电影6", "电影7"]
allUserMovieStarList=[
[1, 1, 1, 0, 1, 0, 0],
[0, 1, 1, 0, 0, 1, 0],
[1, 0, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 0, 0],
[1, 1, 0, 1, 0, 1, 1]]
def converRow2Col():
"""
行转列
:return:
"""
return np.array(allUserMovieStarList).transpose().tolist()
def cal_two_mv_sim(movie1Stars: list, movie2Stars:list):
"""
欧式距离计算两个电影之间的相似度
:param movie1Stars:
:param movie2Stars:
:return:
"""
return np.sqrt(((np.array(movie1Stars) - np.array(movie2Stars)) ** 2).sum())
def cal_all_mv_sim():
"""
计算所有电影之间的相似度
:return:
"""
resDic = {}
tempList = converRow2Col()
for i in range(0, len(tempList)):
for j in range(i+1, len(tempList)):
resDic[str(i) + '-' + str(j)] = cal_two_mv_sim(tempList[i], tempList[j])
return resDic
def calrecommendMoive(username: str) -> list:
"""
计算待推荐的电影
:return:list
"""
temp = {}
movies_sim_dic = cal_all_mv_sim()
userindex = users.index(username)
target_user_movie_list = allUserMovieStarList[userindex]
for i in range(0, len(target_user_movie_list)):
for j in range(i+1, len(target_user_movie_list)):
if target_user_movie_list[i] == 1 and target_user_movie_list[j] == 0 and\
(movies_sim_dic.get(str(i) + '-' + str(j)) != None or\
movies_sim_dic.get(str(j) + '-' + str(i)) != None):
sim = movies_sim_dic.get(str(i) + '-' + str(j)) if(movies_sim_dic.get(str(i) + '-' + str(j)) != None) else movies_sim_dic.get(str(j) + '-' + str(i))
temp[j] = sim
elif target_user_movie_list[i] == 0 and target_user_movie_list[j] == 1 and \
(movies_sim_dic.get(str(i) + '-' + str(j)) != None or \
movies_sim_dic.get(str(j) + '-' + str(i)) != None):
sim = movies_sim_dic.get(str(i) + '-' + str(j)) if (
movies_sim_dic.get(str(i) + '-' + str(j)) != None) else movies_sim_dic.get(
str(j) + '-' + str(i))
temp[i] = sim
temp = sorted(temp.items(), key=lambda d:d[1])
print("待推荐列表:",temp)
recommendlist = [movies[i] for i,v in temp]
print("待推荐列表:", recommendlist)
return recommendlist
print(cal_all_mv_sim())
calrecommendMoive("小李")
calrecommendMoive("小明")
运行结果