用户k和用户a之间的相似度根据一个相似用户a的一系列评价的乘积(修正为该用户的平均评价)的权重。你将需要标准化相似度这样可以使评价维持在1到5之间,最后一步,统计你想预测用户平均评价的总和。
这里考虑到的问题是一些用户评价所有电影时可能要么给最高分,要么给最低分。这些用户给出评价的相对不同比绝对值更重要。例如:设想,用户k对他最喜欢的电影评价4颗星,其他的好电影则评价3颗星。假设现在另一个用户t对他/她喜欢的一部电影评价为5颗星,看了想睡觉的一部电影评价为3颗星。这两位用户电影口味可能很相似但使用评价体系的方法不同。
#第一种
import numpy as np from sklearn.metrics.pairwise import pairwise_distances recommand_rate = np.array([[1,2,0],[1,2,3],[2,1,3]]) def computer_zhangsan_distance(): #计算相似距离,越小越相似,为0完全相同,假如有n个用户,构成nxn的相似矩阵 sim_matrix = pairwise_distances(recommand_rate,metric='cosine') #按行(axis=1)计算用户评分平均值,【:,np.newaxis】表明转换为列的形式 mean_matrix = recommand_rate.mean(axis=1)[:,np.newaxis] #将评分矩阵所有元素按列减去相应的平均值 rating_diff = recommand_rate - mean_matrix #算出相应用户相似度权值的和,按列运算,n个用户算n个 sum_rate = sim_matrix.sum(axis=1)[:,np.newaxis] #按照文档公式1算出所有物品的预测评分 return sim_matrix.dot(rating_diff) / sum_rate +mean_matrix print(computer_zhangsan_distance())
#第二种
import numpy as np def cos_sim(a,b): return a.dot(b) / (np.linalg.norm(a) * np.linalg.norm(b)) recommand_rate = np.array([[1,2,0],[1,2,3],[2,1,3]]) def computer_zhangsan_art(): zhangsan_sim_lisi = cos_sim(recommand_rate[0],recommand_rate[1]) zhangsan_sim_wangwu = cos_sim(recommand_rate[0],recommand_rate[2]) lisi_art_value = recommand_rate[1][2] wangwu_art_value = recommand_rate[2][2] result = (zhangsan_sim_lisi * lisi_art_value + zhangsan_sim_wangwu *wangwu_art_value) / (zhangsan_sim_lisi + zhangsan_sim_wangwu) return result print('zhangsan art value is',computer_zhangsan_art())
#第三种
import numpy as np from sklearn.metrics.pairwise import cosine_similarity def computer_zhangsan_art_vector(): # 计算余弦相似度,越大越相似,为1完全相同 sim_matrix = cosine_similarity(recommand_rate) #得到分子 all_rate = sim_matrix.dot(recommand_rate) #分母 。得到行,换成列 sum_rate = sim_matrix.sum(axis=1)[:,np.newaxis] - 1 return all_rate / sum_rate print(computer_zhangsan_art_vector())