现在我们在机器学习流水线和最近邻分类器中有足够的背景, 让我们开始讨论推荐引擎. 为了构建推荐引擎, 我们需要定义相似性度量, 以便我们可以在数据库中找到与给定用户相似的用户. 欧氏距离分数是我们可以用来计算数据点之间距离的一个度量标准. 我们将把讨论重点放在电影推荐引擎上. 我们来看看如何计算两个用户之间的欧几里得分数.
怎么做...?
- 创建文件并导入需要的包:
# coding: utf-8
import json
import numpy as np
- 我们现在将定义一个函数来计算两个用户之间的欧几里德距离. 第一步是检查用户是否存在于数据库中:
# Returns the Euclidean distance score between user1 and user2
def euclidean_score(dataset, user1, user2):
if user1 not in dataset:
raise TypeError('User ' + user1 + ' not present in the dataset')
if user2 not in dataset:
raise TypeError('User ' + user2 + ' not present in the dataset')
# Movies rated by both user1 and user2
# 为了计算得分, 我们需要提取用户评分的电影
rated_by_both = {}
for item in dataset[user1]:
if item in dataset[user2]:
rated_by_both[item] = 1
# 如果没有共同的电影, 那么用户之间没有相似之处(或至少我们无法根据数据库中的评分来计算它)
if len(rated_by_both) == 0:
return 0
# 对于每个常见的评级, 我们只是计算平方差的和的平方根, 并将其归一化, 使得得分在0和1之间
squared_differences = []
for item in dataset[user1]:
if item in dataset[user2]:
squared_differences.append(
np.square(dataset[user1][item] - dataset[user2][item]))
return 1 / (1 + np.sqrt(np.sum(squared_differences)))
# 如果评级相似, 那么平方差的总和就会很低. 因此, 得分会变高, 这是我们从这个指标中想要的结果
- 我们将使用movie_ratings.json文件作为我们的数据文件. 我们加载它:
if __name__ == '__main__':
data_file = 'movie_ratings.json'
with open(data_file, 'r') as f:
data = json.loads(f.read())
# 让我们考虑两个随机的用户, 并计算欧氏距离
user1 = 'John Carson'
user2 = 'Michelle Peterson'
print ("Euclidean score:")
print (euclidean_score(data, user1, user2))
- 运行以上代码就可以计算出2个用户的欧氏距离.