现在我们在机器学习流水线和最近邻分类器中有足够的背景, 让我们开始讨论推荐引擎. 为了构建推荐引擎, 我们需要定义相似性度量, 以便我们可以在数据库中找到与给定用户相似的用户. 欧氏距离分数是我们可以用来计算数据点之间距离的一个度量标准. 我们将把讨论重点放在电影推荐引擎上. 我们来看看如何计算两个用户之间的欧几里得分数.

怎么做...?

  • 创建文件并导入需要的包:
# 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个用户的欧氏距离.

results matching ""

    No results matching ""