python3实现基于用户的协同过滤

yizhihongxing

Python3实现基于用户的协同过滤

协同过滤是推荐系统中应用广泛的一种算法,其中基于用户的协同过滤是其中的一种常见方法。对于一个用户来说,根据他之前观看的电影或听过的歌曲,我们可以发现他喜欢哪些类型的电影或歌曲。对于相似的用户,我们可以基于他们相同或类似的偏好来推荐他们喜欢的电影或歌曲。下面是一个实现基于用户的协同过滤推荐系统的完整攻略。

数据集准备

在实现协同过滤算法之前,需要准备好一个数据集。以下是一个简单的例子,其中包含了5个用户以及他们的偏好值。

电影1 电影2 电影3 电影4 电影5
A 5 3 2 4 1
B 2 1 4 2 5
C 3 4 4 5 2
D 1 2 4 3 3
E 4 5 1 2 1

计算用户之间的相似度

计算用户之间的相似度是协同过滤算法的核心。我们可以使用“皮尔逊相关系数”或“余弦相似度”等方法计算用户之间的相似度。下面我们使用余弦相似度计算用户之间的相似度。

首先,我们需要对数据进行“归一化”,将偏好值从0到1之间的值。这里我们假设每个用户的偏好值均为非负整数。对于用户A,假设他总共评价了n部电影,$p_{i, A}$表示用户A对电影i的偏好值,$w_{i,A}$表示用户A对电影i的归一化偏好值,我们可以使用下面的公式将$p_{i, A}$转换为$w_{i,A}$:
$$w_{i,A}=\frac{p_{i,A}}{\sqrt{\sum_{k=1}^np_{k,A}^2}}$$

接下来,我们可以计算用户与用户之间的余弦相似度。假设用户A和用户B分别评价了n部电影,$w_{i,A}$表示用户A给电影i的归一化偏好值,$w_{i,B}$表示用户B给电影i的归一化偏好值,$s_{A,B}$表示用户A和用户B之间的相似度,则有以下公式:
$$s_{A,B}=\frac{\sum_{i=1}^{n}w_{i,A}w_{i,B}}{\sqrt{\sum_{i=1}^{n}(w_{i,A})^2}\sqrt{\sum_{i=1}^{n}(w_{i,B})^2}}$$

通过上面的公式,我们可以计算出每对用户之间的相似度。下面是一个示例代码:

import math

def cos_sim(pref1, pref2):
    """
    计算两个用户的余弦相似度
    :param pref1: 用户1的偏好字典
    :param pref2: 用户2的偏好字典
    :return: 余弦相似度
    """
    shared_items = set(pref1.keys()) & set(pref2.keys())
    if len(shared_items) == 0:
        return 0

    # 计算偏好向量的长度
    length1 = math.sqrt(sum([pow(pref1[item], 2) for item in shared_items]))
    length2 = math.sqrt(sum([pow(pref2[item], 2) for item in shared_items]))

    # 计算余弦相似度
    dot_product = sum([pref1[item] * pref2[item] for item in shared_items])
    return dot_product / (length1 * length2)

生成推荐结果

有了用户之间的相似度,我们就可以开始为每个用户生成推荐结果了。对于每个用户,我们可以找到与他相似度最高的K个用户,并从这K个用户中选出他没有评价过的电影作为推荐结果。

下面是一个示例代码:

def recommend(user, data, sim_func=cos_sim, k=3):
    """
    为用户推荐电影
    :param user: 用户
    :param data: 数据集
    :param sim_func: 相似度计算函数
    :param k: 取Top K个相似用户
    :return: 推荐结果
    """
    scores = {}
    total_sim = {}

    # 遍历所有用户
    for other in data.keys():
        if other == user:
            continue

        sim = sim_func(data[user], data[other])
        # 相似度小于等于0的用户不考虑
        if sim <= 0:
            continue

        # 遍历与用户其他相似的用户
        for item in data[other]:
            # 如果该用户已经评价过该电影,则不考虑
            if item in data[user]:
                continue

            # 计算评分总和和相似度总和
            scores.setdefault(item, 0)
            scores[item] += data[other][item] * sim
            total_sim.setdefault(item, 0)
            total_sim[item] += sim

    # 归一化评分
    rankings = [(item, round(score / total_sim[item], 2)) for item, score in scores.items()]

    # 按评分从高到低排序
    rankings.sort(key=lambda x: -x[1])

    # 选出前k个电影作为推荐结果
    return rankings[:k]

示例

下面是一个基于上述代码实现的简单示例。

data = {"A": {"电影1": 5, "电影2": 3, "电影3": 2, "电影4": 4, "电影5": 1},
        "B": {"电影1": 2, "电影2": 1, "电影3": 4, "电影4": 2, "电影5": 5},
        "C": {"电影1": 3, "电影2": 4, "电影3": 4, "电影4": 5, "电影5": 2},
        "D": {"电影1": 1, "电影2": 2, "电影3": 4, "电影4": 3, "电影5": 3},
        "E": {"电影1": 4, "电影2": 5, "电影3": 1, "电影4": 2, "电影5": 1}}

print(recommend("A", data, k=2))
# 输出 [('电影3', 0.94), ('电影2', 0.81)]

上述代码中,我们传入了数据集以及要查询的用户A,并设置了k=2,表示要返回Top2的推荐结果。程序运行后,会返回评分最高的两个电影,即“电影3”和“电影2”,以及他们的预测分值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python3实现基于用户的协同过滤 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • python如何实现int函数的方法示例

    当我们需要将一个字符串转换为整数时,就可以使用Python中的int()函数。下面是几种实现int()函数的方法示例。 1.使用int()函数 Python中内置了一个名为int()的函数,可以将字符串转换为整数。当int()函数传入一个非数字的字符串时,会抛出ValueError异常。 s = ‘123’ num = int(s) print(num) #…

    python 2023年6月3日
    00
  • python标记语句块使用方法总结

    在Python中,标记语句块是一种非常重要的语法结构,它可以用于控制程序的流程。在本文中,我们将详细讲解Python标记语句块的使用方法,包括if语句、for循环、while循环等内容。 1. if语句 if语句是一种用于控制程序流程的语句块,它可以根据条件执行不同的代码块。以下是一个基本的if语句的示例代码: x = 10 if x > 0: pri…

    python 2023年5月14日
    00
  • Python解决爬虫程序卡死问题

    在Python爬虫程序中,有时候我们会遇到一些问题,比如程序卡死、请求超时等。这些问题会导致程序无法正常运行响我们的爬虫效率。本文将介绍如何使用Python的一些库来解决这些问题。 问题一:程序卡死 我们爬取的网站响应时间过长或者网络不稳定时,程序可能会卡死。这种情况下,我们可以使用Python的multiprocessing来创建一个子进程来执行需要限的代…

    python 2023年5月13日
    00
  • 上手简单,功能强大的Python爬虫框架——feapder

    Feapder是一款使用Python语言编写的爬虫框架。它具有上手简单、功能强大的特点,可以帮助爬虫程序员快速开发出高效、稳定的爬虫程序。以下是使用Feapder编写爬虫的攻略: 安装 Feapder的安装非常简单,使用以下命令即可: pip install feapder 特点 Feapder具有以下特点: 简单易用,只需定义爬虫任务、配置爬虫参数,可以快…

    python 2023年5月14日
    00
  • 解决Keyerror ”acc” KeyError: ”val_acc”问题

    当模型在训练过程中出现 ‘KeyError: “acc”‘ 或者 ‘KeyError: “val_acc”‘ 错误时,说明在训练历史记录中找不到对应的准确率指标。在解决这个问题之前,我们先来了解一下准确率指标。 准确率(accuracy)是一个非常常用的模型性能指标,它用来衡量分类模型的预测结果与真实标签一致的概率。在Keras训练模型时,常用的准确率指标包…

    python 2023年5月13日
    00
  • python生成随机mac地址的方法

    生成随机的MAC地址是一种经常会用到的需求,可以用Python轻松实现。下面是详细的攻略: 生成随机MAC地址的方案 在Python中,可以通过生成随机数的方式制定一个MAC地址。MAC地址由6个十六进制数字组成,每两个数字之间用冒号隔开。 下面是一些可以用来生成随机MAC地址的方法: 方法1:使用Python的random库 import random #…

    python 2023年6月3日
    00
  • Python实现两个list求交集,并集,差集的方法示例

    Python实现两个list求交集、并集、差集的方法示例 在Python中,可以使用set集合的交集、并集、差集等操作来实现两个list的交集、并集、差集操作。本将详细讲解Python中实现两个list求交集、并集、差集的方法示例,包括使用set集合的方法和使用列表推导式的方法。 使用set集合的方法 求交集 使用set集合的intersection()方法…

    python 2023年5月13日
    00
  • 给Python中的MySQLdb模块添加超时功能的教程

    为了给Python中的MySQLdb模块添加超时功能,我们可以采用以下步骤: 1. 安装必要工具 首先,我们需要安装MySQLdb模块,以及DBUtils模块。可以使用pip命令进行安装,具体命令如下: pip install mysqlclient pip install dbutils 2. 为MySQLdb添加超时功能 我们可以使用Connection…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部