不到40行代码用Python实现一个简单的推荐系统

不到40行代码用Python实现一个简单的推荐系统

推荐系统是一种常见的人工智能应用,它可以根据用户的历史行为和偏好向用户推荐可能感兴趣的品。本文将介绍如何使用Python实现一个简单的推荐系统,该系统基于用户-物品评分矩阵,使用协同过滤算法进行推荐。

1. 数据集

我们将使用MovieLens数据集来演示如何使用协同过滤算法进行推荐。数据集包含多个用户对多个电影的评分评分范围为1到5。以下是数据集的示例:

用户ID 电影ID 评分
1 1 5
1 2 3
1 3 4
2 1 3
2 2 4
2 3 5
3 1 4
2 2
3 3 1

2. 协同过滤算法

协同过滤算法是一种基于用户或物品的推荐算法,它通过分析用户-物品评分矩阵,找到相似的用户物,并向用户推荐相似物品。具体实现步骤如下:

  1. 构建用户-物品评分矩阵。
  2. 计算间或物品之间的相似度。
  3. 根据相似度,找到与目标用户或物品最相似的K个用户或物4. 根据K个用户或物品的评分,预测目标用户对目标物品的评分。

以下是协同过滤算法的Python实现:

import numpy as np

class CollaborativeFiltering:
    def __init__(self, k=3):
        self.k = k

    def fit(self, X):
        self.X = X
        self.similarity = np.zeros((len(X), len(X)))
        for i in range(len(X)):
            for j in range(i+1, len(X)):
                mask = np.logical_and(X[i] > 0, X[j] > 0)
                if np.sum(mask) > 0:
                    self.similarity[i, j] = np.sum((X[i][mask] - X[j][mask])**2)
                    self.similarity[j, i] = self.similarity[i, j]
        self.neighbors = np.argsort(-self.similarity, axis=1)[:, :self.k]

    def predict(self, user_id, item_id):
        mask = self.X[:, item_id] > 0
        if np.sum(mask) == 0:
            return 0
        similarities = self.similarity[user_id, mask]
        indices = np.argsort(-similarities)[:self.k]
        weights = similarities[indices]
        ratings = self.X[indices, item_id]
        return np.sum(weights * ratings) / np.sum(weights)

这个代码实现了一个名为CollaborativeFiltering类,它包含两个方法:

  • fit(X):用于训练协同过滤推荐器,其中X是一个二维数组,表示用户-物品评分矩阵。
  • predict(user_id, item_id):用于预测目标用户对目标物品评分,其中user_id是目标用户的ID,item_id是目标物品的ID。

3. 示例

示例1

在示例1中,我们使用了MovieLens数据集,使用CollaborativeFiltering类对数据集进行推荐,并输出推荐结果。

import pandas as pd

ratings = pd.read_csv('ratings.csv')
X = ratings.pivot(index='userId', columns='movieId', values='rating').fillna(0).values

cf = CollaborativeFiltering(k=3)
cf.fit(X)

user_id = 1
item_id = 1
rating = cf.predict(user_id-1, item_id-1)
print(f'User {user_id} is likely to rate item {item_id} with a rating of {rating:.2f}')

这个示例将使用上述代码对MovieLens数据集进行推荐,并输出推荐结果。

示例2

在示例2中,我们使用了一个包含5个用户和5个物品的评分矩阵,使用CollaborativeFiltering对评分矩阵进行推荐,并推荐结果。

X = np.array([
    [5, 3, 0, 1, 4],
    [1, 0, 5, 4, 2],
    [4, 2, 1, 3, 0],
    [0, 0, 4, 5, 1],
    [2, 4, 0, 0, 5],
])

cf = CollaborativeFiltering(k=2)
cf.fit(X)

user_id = 0
item_id = 2
rating = cf.predict(user_id, item_id)
print(f'User {user_id} is likely to rate item {item_id} with a rating of {rating:.2f}')

这个示例将使用上述代码对评分矩阵进行推荐,并推荐结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:不到40行代码用Python实现一个简单的推荐系统 - Python技术站

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

相关文章

  • 浅谈python中列表、字符串、字典的常用操作

    浅谈Python中列表、字符串、字典的常用操作 Python是一门广泛使用的高级编程语言,拥有各种各样的数据类型和操作,其中包括列表、字符串和字典。这些数据类型在Python中非常常用,因此了解它们的常用操作十分重要。在本篇攻略中,我们将一一介绍这三种数据类型的常用操作。 I. 列表(List) 列表是Python中最常用的数据类型之一。它可以包含任何类型的…

    python 2023年6月5日
    00
  • pygame实现井字棋之第三步逻辑优化

    让我来详细讲解“pygame实现井字棋之第三步逻辑优化”的完整攻略。 1. 实现功能 在实现“pygame实现井字棋之第三步逻辑优化”之前,我们首先要了解这个游戏需要实现哪些功能。在之前的第二步代码(https://www.jianshu.com/p/e0f0c430f5fe)中,我们已经实现了一个可以在窗口中显示的井字棋游戏,用户可以通过鼠标点击的方式在窗…

    python 2023年5月14日
    00
  • python 字典item与iteritems的区别详解

    Python字典是由键值对key-value组成的一种数据结构。其中,key为唯一的值,而每一个key对应一个value。我们可以使用dictionary[key]的方式获取字典中key对应的值,也可以使用dictionary.get(key)获取。但是,我们如果想要遍历字典中的键值对,就需要使用字典的items()或者iteritems()方法。 item…

    python 2023年5月13日
    00
  • python中字符串内置函数的用法总结

    为了更好地让读者了解并掌握Python字符串内置函数的使用方法,本文将从以下几个方面进行介绍: Python字符串的基本操作 字符串内置函数的分类 字符串内置函数的用法总结 Python字符串的基本操作 字符串是Python中的一种基本数据类型,可以用单引号或双引号表示,例如: text1 = ‘hello world!’ text2 = "Pyt…

    python 2023年6月5日
    00
  • Python实现的数据结构与算法之队列详解

    下面是详细讲解“Python实现的数据结构与算法之队列详解”的完整攻略。 队列的定义 队列(Queue)是一种先进出(FIFO)的数据构,类似于现实生活中的排队。队列有两个基本操作:入队(enqueue)和出队(dequeue)。入队操作将元素添加到队列的末尾,出队操作将队列的第一个元移除返回。 队列实现 队列可以使用Python中的列表(list)来实现。…

    python 2023年5月14日
    00
  • Python 获取今天任意时刻的时间戳的方法

    获取今天任意时刻的时间戳,可以通过Python的标准库time模块中的time()函数来实现。下面是完整攻略: 1.导入time模块 在Python中,获取时间戳需要使用time模块。因此,在代码中需要先导入该模块: import time 2.获取今天任意时刻的时间戳 获取今天任意时刻的时间戳,可以使用time模块的mktime()函数,该函数将当前时间转…

    python 2023年6月2日
    00
  • 详解希尔排序算法原理与使用方法

    以下是关于希尔排序算法的完整攻略: 一、希尔排序是什么 希尔排序也被称为缩小增量排序。它是一种改良自插入排序的排序算法,由Donald Shell在1959年提出。 二、希尔排序的执行过程 希尔排序通过定义一个增量序列来对原始数据进行排序,增量序列的最后一个元素必须为1。 以下是希尔排序的执行过程: 选择一个增量序列,例如:{n/2,(n/2)/2…1}…

    算法 2023年3月27日
    00
  • 在scrapy中使用phantomJS实现异步爬取的方法

    在Scrapy中使用PhantomJS实现异步爬取的方法 PhantomJS是一个基于WebKit的无界面浏览器,它可以模拟浏览器的行为,支持JavaScript、CSS、DOM等Web标准。在Scrapy中使用PhantomJS可以实现异步爬取,提高爬取效率。 以下是一个完整攻略包括两个示例。 步骤1:安装PhantomJS 首先,需要安装PhantomJ…

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