Loading [MathJax]/jax/input/TeX/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >推荐算法之协同过滤介绍以及Python实现

推荐算法之协同过滤介绍以及Python实现

原创
作者头像
Awesome_Tang
修改于 2019-09-02 02:49:57
修改于 2019-09-02 02:49:57
2K0
举报
文章被收录于专栏:FSocietyFSociety

介绍

协同过滤简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,回应不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要。 协同过滤又可分为评比(rating)或者群体过滤(social filtering)协同过滤以其出色的速度和健壮性,在全球互联网领域炙手可热。

以上来自于百度百科介绍,协同过滤(collaborative filtering)在我们推荐系统中发挥了巨大作用,譬如抖音会基于你的点赞记录等推送视频,淘宝会基于你的浏览记录等推送商品,这些其实都离不开协同过滤算法。

  • 如网易云音乐上的喜欢这首歌的人也在听

协同过滤我们一般可以将其分为两类:

  • 基于user
  • 基于item(可能是商品,电影,视频等等)

基于user的算法会先根据你的浏览记录,收藏记录等找到与你相似的人群,然后再将相似的人群中喜欢的商品,电影等再推送给你,如网易云音乐中的私人FM

网易云音乐—私人FM
网易云音乐—私人FM

基于item的算法会是假如你查看了某件商品,然后算法会去找到与之相似的商品再来推荐给你,如淘宝上的看了又看

淘宝—看了又看
淘宝—看了又看

算法整体逻辑来说其实很简单,主要是如何去找到相似的user or item,接下来会通过MovieLens数据集实现一个简单的基于用户的协同过滤算法。

数据集

MovieLens数据集包含多个用户对多部电影的评级数据,也包括电影元数据信息和用户属性信息,根据量级的大小又分为不同版本,本文选用的最小的1M版本。

文件下载下来会有三个数据文件以及一个readme文档:

  • users.dat:用户信息,包括用户年纪,性别,职业等信息;
  • movies.dat:电影信息,电影名,分类等信息;
  • ratings.dat:用户对于电影的评分信息,这也是本次文章会主要用到的数据,数据示例如下:

user_id

movie_id

rating

timestamp

1

1193

5

978300760

2

661

3

978302109

3

3408

4

978300275

相似用户

为方便计算,我们将rating数据转换成一个(n,m)的稀疏矩阵,其中n为用户数,m为电影数目,xij的值表示用户i对于电影j的评分。

对于useri的评分信息便是一个长度为m的数组,我们将useri的评分信息与其他所有用户的评分信息去对比,找到最相似的那一个或者那一群用户。

如何去定义相似,选择很多,需要去结合不同的场景来选择:

  • 欧式距离;
  • 余弦相似度;
  • Jaccard系数;
  • 皮尔逊系数;
  • 汉明距离;
  • ...

具体的计算公式各位可自行去百度,我就不一一介绍了,毕竟Markdown里面敲数据公式可太难受了。

不知各位有没有发现,这一步其实与K-NN算法很类似,K-NN中是找到相似的k个用户然后去进行分类,我们其实也需要去找到相似的k个用户,然后根据这k个用户的评分记录去进行电影推荐。

推荐

通过上一步获取到相似的k个用户之后,根据这k个用户的评分我们便能得到一个待推荐的movie list,然后我们可以通过电影的热门程度或者评分高低将其依次推荐给用户,一个简单的推荐系统便算是完成了。

代码部分

代码语言:txt
AI代码解释
复制
"""
@File    : co_filtering.py
@Time    : 2019/8/29 12:22
@Author  : AwesomeTang
"""

from data_helper import DataSet
from math import sqrt


class CoFiltering:

    def __init__(self):
        self.data = DataSet()

    def pearson_sim(self, user1, user2):
        """
        Calculate Pearson-Correlation-Coefficient of user1 & user2.
        """
        user1_array = self.data.matrix[user1 - 1]
        user2_array = self.data.matrix[user2 - 1]
        length = len(user1_array)
        sum1 = sum(user1_array)
        sum2 = sum(user2_array)
        sum_mul = self.multi(user1_array, user2_array)
        sum_x2 = sum([i ** 2 for i in user1_array])
        sum_y2 = sum([j ** 2 for j in user2_array])
        num = sum_mul - (float(sum1) * float(sum2) / length)
        den = sqrt((sum_x2 - float(sum1 ** 2) / length) * (sum_y2 - float(sum2 ** 2) / length))
        return num / den

    @staticmethod
    def multi(x, y):
        """
        To get two 1D-arrays' multiply result.
        The two arrays must have the same size.
        :param x: one array.
        :param y: another array.
        :return: multiply result.
        """
        result = 0.
        for i in range(len(x)):
            result += x[i] * y[i]
        return result

    def most_similar(self, user1, top_n=5):
        """
        To find TOP_N most similar users.
        :param user1: user_id, NOT ARRAY, eg. 23
        :param top_n: Just like what "TOP_N" said.
        :return: LIKE "[(most_similar_user_1, score),...(most_similar_user_topN, score)]".
        """
        result_collect = {}
        for user2 in self.data.users:
            if user2 == user1:
                pass
            else:
                try:
                    result = self.pearson_sim(user1, user2)
                    result_collect[user2] = result
                except IndexError:
                    pass

        results_sorted = sorted(result_collect.items(), key=lambda item: item[1], reverse=True)[:top_n]
        print('Most similar users: {}'.format(' | '.join([str(x[0]) for x in results_sorted])))
        return results_sorted

    def predict(self, user, top_n=5, recommend_num=5):
        if user not in self.data.users:
            raise ValueError('Cannot find user "{}", please check.'.format(user))

        results = self.most_similar(user, top_n)
        recommend = []
        for user_id, val in results:
            diff_list = list(self.data.matrix[user_id] - self.data.matrix[user])
            temp = filter(lambda x: x[1] > 0, enumerate(diff_list))
            recommend.extend(temp)
        recommend = sorted(recommend, key=lambda x: x[1], reverse=True)

        movie_list = []
        while True:
            for i in range(1, 6).__reversed__():
                temp_list = filter(lambda x: x[1] == i, recommend)
                temp_list = sorted(temp_list, key=lambda x: self.data.move_pop_rank[x[0]], reverse=True)
                for x in temp_list:
                    movie_id = x[0] + 1
                    if movie_id not in movie_list:
                        movie_list.append(movie_id)
                if len(movie_list) >= recommend_num:
                    break
                else:
                    continue
            break
        movie_list = [self.data.id2movie(x) for x in movie_list[:recommend_num]]
        print('Recommend movies: {}'.format(' | '.join(movie_list)))


if __name__ == "__main__":
    cf = CoFiltering()
    cf.predict(1464, 5, 5)

最后

以上便是一个简单的协同过滤推荐算法的实现,当然在实际应用过程中,远比以上复杂,还需要考虑很多东西:

  • item的热门程度和user的活跃程度,毕竟有时候我看了一篇文章并不是因为我有多喜欢,而是你们一直将它放在首页;
  • 上下文关系,比如我买了牙膏之后不需要你推荐相似的牙膏,而可能更需要推荐一把牙刷;
  • 时间因素,我昨天感兴趣的不代表我今天还感兴趣;
  • 甚至在你对着你的算法沾沾自喜的时候,你老板走过来跟你说:瞅瞅你这推荐的啥东西,都是一些亏本的商品,能不能推荐点利润高的产品;

skr~ skr~~~

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
协同过滤原理及Python实现
作者:ACdreamers 链接:http://blog.csdn.net/acdreamers/article/details/44672305 1. 协同过滤的简介 关于协同过滤的一个最经典的例子就是看电影,有时候不知道哪一部电影是我们喜欢的或者评分比较高的,那么通常的做法就是问问周围的朋友,看看最近有什么好的电影推荐。在问的时候,都习惯于问跟自己口味差不多的朋友,这就是协同过滤的核心思想。 协同过滤是在海量数据中挖掘出小部分与你品味类似的用户,在协同过滤中,这些用户成为邻居,然后根据他们喜欢的东西组织
昱良
2018/04/08
1.4K0
协同过滤原理及Python实现
协同过滤推荐算法代码实现(rsa算法例题)
协同过滤是利用集体智慧的一个典型方法。要理解什么是协同过滤 (Collaborative Filtering, 简称 CF),首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做?大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐,而我们一般更倾向于从口味比较类似的朋友那里得到推荐。这就是协同过滤的核心思想。
全栈程序员站长
2022/08/01
4810
协同过滤推荐算法代码实现(rsa算法例题)
协同过滤的智慧与实战,从零理解推荐系统
互联网信息爆炸的时代,每当我们打开一些短视频平台时推荐的影视剧总有一款符合你的口味,电商平台首页展示的商品恰好是你最近需要的物品,这些看似神奇的"读心术"背后,正是推荐系统在发挥作用。其中,协同过滤算法作为最经典的推荐技术之一,就像一位善于观察的茶馆老板:通过记录不同茶客的口味偏好,总能给新客人推荐最合适的茶点。本文将带您深入浅出地理解这项技术,揭秘现代推荐系统的运行逻辑。
不惑
2025/04/15
1580
协同过滤的智慧与实战,从零理解推荐系统
基于用户的协同过滤python代码实现
在推荐算法概述中介绍了几种推荐算法的概念,但是没有具体代码实现,本篇文章首先来看一下基于用户的协同过滤python代码。
三猫
2020/05/20
1.8K5
基于协同过滤的电影推荐系统的设计与实现(协同过滤推荐算法伪代码)
Apache Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。经典算法包括聚类、分类、协同过滤、进化编程等等,并且,在 Mahout 中还加入了对Apache Hadoop的支持,使这些算法可以更高效的运行在云计算环境中。
全栈程序员站长
2022/07/28
2.7K0
基于协同过滤的电影推荐系统的设计与实现(协同过滤推荐算法伪代码)
混合推荐系统:结合协同过滤与内容推荐
随着互联网的迅猛发展,各类信息和产品日益增多,用户面临的信息过载问题越来越严重。推荐系统作为解决信息过载问题的重要技术手段,得到了广泛的应用。推荐系统通过分析用户的历史行为和兴趣偏好,向用户推荐可能感兴趣的内容或产品,提升用户体验。
数字扫地僧
2024/08/04
7820
python 实现协同过滤推荐算法
测试数据 http://grouplens.org/datasets/movielens/
全栈程序员站长
2022/07/25
5920
python 实现协同过滤推荐算法
[推荐算法]基于用户的协同过滤算法「建议收藏」
推荐算法最早在1992年就提出来了,但是火起来实际上是最近这些年的事情,因为互联网的爆发,有了更大的数据量可以供我们使用,推荐算法才有了很大的用武之地。
全栈程序员站长
2022/09/07
6360
协同过滤推荐算法
相信大家对推荐系统已经很熟悉了,它通过分析用户的历史行为,挖掘用户的兴趣爱好,预测并推荐给用户其接下来有可能感兴趣的事物,例如商品推荐、音乐推荐、新闻以及最近很火的短视频推荐等等。
小萌哥
2020/07/21
1.5K0
协同过滤推荐算法
协同过滤的原理及Python实现
作者:李小文,先后从事过数据分析、数据挖掘工作,主要开发语言是Python,现任一家小型互联网公司的算法工程师。
Python中文社区
2018/12/07
9200
协同过滤技术在推荐系统中的应用
协同过滤(Collaborative Filtering)是推荐系统中最常用和最有效的技术之一。它基于用户和项目之间的交互数据来进行推荐,而无需了解项目的具体内容。协同过滤技术主要分为两大类:基于用户的协同过滤(User-based Collaborative Filtering)和基于项目的协同过滤(Item-based Collaborative Filtering)。以下是协同过滤技术在推荐系统中的详细应用介绍。
数字扫地僧
2024/08/07
4100
使用Python实现推荐系统模型
推荐系统是一种利用算法为用户提供个性化推荐的技术,广泛应用于电子商务、社交媒体和内容平台等领域。在这篇博客教程中,我们将使用 Python 实现一个简单的基于协同过滤的推荐系统模型,帮助你了解推荐系统的基本原理和实现方法。
Echo_Wish
2024/04/25
4560
算法推荐 — 协同过滤
求解评分矩阵的一种典型方法是:ALS,在spark-mllib库中有实现好的api;
木野归郎
2020/06/15
8990
算法推荐 — 协同过滤
协同过滤推荐算法(一)
上节课我们简单介绍了推荐系统的总体框架思路,从本节课开始我们将对推荐系统中的核心算法进行详细讲解。在目前主流的推荐算法中,使用最多也是最经典的,当属协同过滤算法!
用户7569543
2021/03/18
1K0
【机器学习】创建自己的电影推荐系统
每个人都喜欢电影,不分年龄、性别、种族、肤色或地理位置。通过这种神奇的媒介,我们在某种程度上彼此联系在一起。然而,最有趣的是,我们的选择和组合在电影偏好方面是多么独特。
黄博的机器学习圈子
2021/04/16
1.9K0
【机器学习】创建自己的电影推荐系统
使用Python3.7配合协同过滤算法(base on user,基于人)构建一套简单的精准推荐系统(个性化推荐)
    时至2020年,个性化推荐可谓风生水起,Youtube,Netflix,甚至于Pornhub,这些在互联网上叱咤风云的流媒体大鳄无一不靠推荐系统吸引流量变现,一些电商系统也纷纷利用精准推荐来获利,比如Amzon和Shopfiy等等,精准推荐用事实告诉我们,流媒体和商品不仅仅以内容的传播,它还能是一种交流沟通的方式。
用户9127725
2022/08/08
4300
使用Python3.7配合协同过滤算法(base on user,基于人)构建一套简单的精准推荐系统(个性化推荐)
练习题︱ python 协同过滤ALS模型实现:商品推荐 + 用户人群放大
之前的一个练习题:练习题︱豆瓣图书的推荐与搜索、简易版知识引擎构建(neo4j)提及了几种简单的推荐方式。 但是在超大规模稀疏数据上,一般会采用一些规模化的模型,譬如spark-ALS就是其中一款。 这边,笔者也是想调研一下这个模型的操作性,所有就先用单机版的测试一下;对应的spark.mlib有分布式的版本。
悟乙己
2021/12/07
9080
练习题︱ python 协同过滤ALS模型实现:商品推荐 + 用户人群放大
学习协同过滤推荐 \w 100行Python代码
用一百行 Python 代码,入门协同过滤推荐。
刘笑江
2018/05/28
1.2K5
基于协同过滤的推荐引擎(实战部分)
基于协同过滤的推荐引擎(理论部分) 时隔十日,终于决心把它写出来。大多数实验都是3.29日做的,结合3.29日写的日记完成了这篇实战。 数据集准备 数据集使用上篇提到的Movielens电影评分数据里
刘开心_1266679
2018/04/17
9870
基于协同过滤的推荐引擎(实战部分)
协同过滤算法概述与python 实现协同过滤算法基于内容(usr-item,item-item)
协调过滤推荐概述   协同过滤(Collaborative Filtering)作为推荐算法中最经典的类型,包括在线的协同和离线的过滤两部分。所谓在线协同,就是通过在线数据找到用户可能喜欢的物品,而离线过滤,则是过滤掉一些不值得推荐的数据,比比如推荐值评分低的数据,或者虽然推荐值高但是用户已经购买的数据。   协同过滤的模型一般为m个物品,m个用户的数据,只有部分用户和部分数据之间是有评分数据的,其它部分评分是空白,此时我们要用已有的部分稀疏数据来预测那些空白的物品和数据之间的评分关系,找到最
学到老
2018/04/18
7.7K0
协同过滤算法概述与python 实现协同过滤算法基于内容(usr-item,item-item)
推荐阅读
相关推荐
协同过滤原理及Python实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档