知识图谱实战应用4-知识图谱中寻找相似用户(协同过滤算法)

大家好,我是微学AI,今天给大家讲一下知识图谱中利用协同过滤算法寻找相似用户。大家会看到一个新的名词:“协同过滤”,下面来介绍一下协同过滤算法。

一、协同过滤算法

协同过滤算法是一种基于用户行为分析的推荐算法。它的基本思想是利用用户之间的相似性来推荐物品,即如果两个用户喜欢同一样物品,那么他们可能会喜欢相似的其他物品。

协同过滤算法可以分为两种类型:基于用户的协同过滤算法和基于物品的协同过滤算法。

基于用户的协同过滤算法首先计算用户之间的相似度,然后利用相似度为某个用户推荐物品。

基于物品的协同过滤算法则是首先计算物品之间的相似度,然后利用相似度为某个用户推荐和他喜欢的物品相似的其他物品。

协同过滤算法的实现也有多种方法,例如基于邻居的方法、基于矩阵分解的方法等。基于邻居的方法是指利用相邻的用户或物品进行推荐,其中相邻的定义可以根据不同的相似度度量方式进行定义。基于矩阵分解的方法则是将用户和物品的评分矩阵分解成两个较低维度的矩阵,从而可以通过乘积重构评分矩阵并进行推荐。 协同过滤算法具有简单直观、可扩展性强等优点,但也存在数据稀疏、冷启动等问题。因此需要根据具体场景进行算法选择和改进,以提高推荐效果。

这张图可以生动形象地了解协同过滤算法的推荐过程。

二、协同过滤算法原理与操作

协同过滤算法,具体来说,对于每一个用户,算法会计算其与其他用户之间的相似度,然后根据相似度的大小,选取与其最相似的K个用户。对于每个物品,算法会找出它被前述K个最相似用户中的哪些用户喜欢过,然后将这些物品推荐给当前用户。 基于物品的协同过滤算法则是通过计算物品之间的相似度来推荐相似的物品。物品之间相似度通常也是基于余弦相似度或者皮尔逊相关系数计算得到。具体来说,对于每一个物品,算法会计算出其与其他物品之间的相似度,然后根据相似度的大小,选取与其最相似的前K个物品。对于当前用户的历史行为数据,算法会找出他曾经评价过或者购买过的物品中,与被推荐的物品最相似的前K个,并将这些物品作为推荐结果返回给用户。 需要注意的是,协同过滤算法本身是基于历史数据进行推荐,对于没有历史数据或仅有一个或两个评分的用户或物品,算法可能存在数据稀疏的问题。在面对这种情况时,需要采取特殊的算法方法或者引入其他辅助信息以解决数据稀疏带来的推荐问题。

 三、代码实现

import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity

def find_similar_users(user_id, ratings_df, num_users=5):
    """
    基于用户的协同过滤算法,找到与给定用户最相似的用户
    参数:
    user_id (int): 需要找到相似用户的用户ID
    ratings_df (pandas.DataFrame): 用户电影评分数据框,包含三列:userId, movieId, rating
    num_users (int): 返回的相似用户数量,默认为5

    返回:
    similar_users (list): 与给定用户相似度最高的num_users个用户的ID和相似度,按照相似度从高到低排名
    """
    # 构建用户-电影评分矩阵
    user_movie_matrix = ratings_df.pivot_table(index='userId', columns='movieId', values='rating', fill_value=0)

    # 计算相似度矩阵
    sim_matrix = cosine_similarity(user_movie_matrix)

    # 获取给定用户的相似度向量
    user_sim_vector = sim_matrix[user_id-1]

    # 获取所有用户的相似度向量
    all_sim_vectors = sim_matrix[:,user_id-1]

    # 构建相似度DataFrame
    sim_df = pd.DataFrame({'userId': ratings_df['userId'].unique(), 'similarity': all_sim_vectors})

    # 根据相似度从高到低排序,排除自己
    sim_df = sim_df[sim_df['userId'] != user_id].sort_values(by='similarity', ascending=False).head(num_users)

    # 返回相似用户列表
    similar_users = list(zip(sim_df['userId'], sim_df['similarity']))

    return similar_users


ratings_df = pd.read_csv('ratings.csv')
similar_users = find_similar_users(2, ratings_df, num_users=8)
ratings_df = pd.read_csv('ratings.csv')
similar_users = find_similar_users(2, ratings_df, num_users=8)
for i in similar_users:
    print(f'用户id:{i[0]},相似度:{i[1]}')

运行结果:

用户id:7,相似度:0.9849057238849922
用户id:5,相似度:0.5686318341859367
用户id:1,相似度:0.5387724584403655
用户id:4,相似度:0.45127214755828327
用户id:3,相似度:0.35855967894562796
用户id:6,相似度:0.3521566452468871

相似的用户按照顺序排序下来。

欢迎大家持续关注,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/5573.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

php微信小程序java+Vue高校课程课后辅导在线教育系统nodejs+python

目 录 1绪论 1 1.1项目研究的背景 1 1.2开发意义 1 1.3项目研究现状及内容 5 1.4论文结构 5 2开发技术介绍 7 2.1 B/S架构 7 2.2 MySQL 介绍 7 2.3 MySQL环境配置 7 2.5微信小程序技术 8 3系统分析 9 3.1可行性分析 9 3.1.1技术可行性 9 3.1.2经济可行性 9 3.1.3操作可行性 10 …

MySQL的查询完结,vju树状题组完结,cf补题

目录 MySQL 查询 比较条件 判空 逻辑条件 模糊条件 where in 聚合查询 排序查询 vju 线段树OR树状数组 - Virtual Judge cf Problem - A - Codeforces Problem - A - Codeforces Problem - B - Codeforces 周总结 MySQL 查询 比较条件 SELECT *FROM student WH…

细思极恐,第三方跟踪器正在获取你的数据,如何防范?

细思极恐,第三方跟踪器正在获取你的数据,如何防范? 当下,许多网站都存在一些Web表单,比如登录、注册、评论等操作需要表单。我们都知道,我们在冲浪时在网站上键入的数据会被第三方跟踪器收集。但是&#x…

[C++]C++基础知识概述

目录 C基础知识概述:: 1.什么是C 2.C发展史 3.C关键字 4.命名空间 5.C的输入输出 6.缺省参数 7.函数重载 8.引用 9.内联函数 10.auto关键字(C11) 11.基于范围的for循环(C11) 12.指针空值—nullptr(C11) C基础知识概述&#xff1…

React中使用lodash防抖失效解决

React中使用lodash防抖失效解决 import {Input} from antd; import lodash from lodash; // lodash下的防抖函数 const debounce lodash.debounce; // 防抖打印,希望输入的时候,延迟0.5s后打印值 const getSuggestion debounce((val:string) > {co…

SpringCloud微服务技术栈.黑马跟学(九)

SpringCloud微服务技术栈.黑马跟学 九今日目标1.分布式事务问题1.1.本地事务1.2.分布式事务1.3.演示分布式事务问题2.理论基础2.1.CAP定理2.1.1.一致性2.1.2.可用性2.1.3.分区容错2.1.4.矛盾2.2.BASE理论2.3.解决分布式事务的思路3.初识Seata3.1.Seata的架构3.2.部署TC服务一、…

GPT-4老板:AI可能会杀死人类,已经出现我们无法解释的推理能力

来源: 量子位 微信号:QbitAI “AI确实可能杀死人类。” 这话并非危言耸听,而是OpenAI CEO奥特曼的最新观点。 而这番观点,是奥特曼在与MIT研究科学家Lex Fridman长达2小时的对话中透露。 不仅如此,奥特曼谈及了近期围绕ChatGPT…

《统计学习方法》学习笔记之第一章

统计学习方法的学习笔记:第一章 目录 第一节 统计学习的定义与分类 统计学习的概念 统计学习的分类 第二节 统计学习方法的基本分类 监督学习 无监督学习 强化学习 第三节 统计学习方法三要素 模型 策略 第四节 模型评估与模型选择 训练误差与测试误差 过…

Ubuntu设置清华源

本文为自己安装记录回顾用 下面的是ubuntu20.04Ubuntu 更换镜像源 Ubuntu默认的服务器是在国外,连接很慢。 更换成国内的镜像源,使用清华镜像源,连接就会快一点 下面介绍更换清华镜像源的方法 1.打开Ubuntu的控制台(快捷键ctrlAlt…

Mysql事务(MVCC实现原理)、锁、sql优化

一.事务 数据库事务就是访问、操作各种数据的一个数据库操作序列, 是由事务开始到事务结束之间全部的执行过程组成的, 事务处理可以用来维护数据库的完整性, 保证成批的sql要么全部执行要么全部都不执行, 当然在mysql中只有使用了Innodb数据库引擎的数据库或表才有事务. 事…

2023值得我们关注的10种软件测试趋势

未来测试的趋势 随着软件在商业和日常生活中继续发挥关键作用,测试将不断发展以满足现代数字环境的需求。客户对软件得质量有着很高的要求并且测试时间应该更加快。因此,组织努力更快、更频繁地交付他们的软件,并且测试过程需要更多地集成到开…

C++继承相关总结

文章目录前言1.继承的相关概念1.继承概念2.继承的相关语法3.基类和派生类对象赋值转换(赋值兼容规则)2.继承中的注意事项1.继承中的作用域2.派生类的默认成员函数1.构造函数与拷贝构造2.赋值重载与析构3.友元关系与静态成员变量3.多继承(菱形继承)1.虚拟继承2.虚拟继…

栈和队列OJ题合集(包含循环队列的两种实现)

目录 一:前言 二:有效的括号(括号匹配) 三:用队列实现栈 四:用栈实现队列 五:设计循环队列 一:前言 对栈和队列的基本性质和实现有问题的可以看上一期 链接:http://t.csdn.cn/YQMBA​​​​ 注意:本文用数据的大小来表示入栈入队的先后。 二:有效的括号(括号匹配…

fastp软件介绍

fastp软件介绍1、软件介绍2、重要参数解析2.1 全部参数2.2 使用示例2.3 重要参数详解(1)UMI去除(2)质量过滤(3)长度过滤(4)低复杂度过滤(5)adapter过滤&#…

《文章复现》考虑用户舒适度的冷热电多能互补综合能源系统优化调度

说明书 免费:https://download.csdn.net/download/qq_50594161/87625438 MATLAB代码:考虑用户舒适度的冷热电多能互补综合能源系统优化调度 关键词:用户舒适度 综合能源 PMV 优化调度 参考文档:《冷热电气多能互补的微能源网鲁…

什么是RabbitMQ?有什么用如何使用?一文回答

RabbitMQ RabbitMQ channel:操作MQ的工具exchange:交换机,路由消息到队列中queue:队列,缓存消息virtual host:虚拟主机,对queue,exchange等资源的逻辑分组 MQ模型 基本消息队列工作…

Java 8 - Lambda 表达式

1. 函数式接口 当一个接口中只有一个非 default 修饰的方法,这个接口就是一个函数式接口用 FunctionalInterface 标注 1)只有一个抽象方法 FunctionalInterface public interface MyInterface {void print(int x); } 2)只有一个抽象方法和…

射频接收机概述

接收机架构 射频接收机架构是指电子设备中用于接收无线电信号的部分。它通常由前置放大器、中频放大器、混频器、局部振荡器和带通滤波器等组成。以下是一个基本的射频接收机架构: 前置放大器:前置放大器的作用是放大接收天线接收到的微弱无线电信号&am…

程序员万万不能去的3种公司,越做越倒退,过来人的经验

俗话说“条条大路通罗马”,但是对于程序员来说,有些路千万别走,走得越久越难以抽身,甚至说毁掉你的职业生涯。 今天来跟大家讲一下,作为程序员,有些公司千万不要进去,你以为稀松平常&#xff0…

用Python发送电子邮件?这也太丝滑了吧(21)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 欢迎和猫妹一起,趣味学Python。 今日主题 猫爸赚钱养家,细想起来真的不容易啊! 起早贪黑,都是6点早起做早饭,送…