基于物品的协同过滤算法(1)

算法篇--协同过滤 文章目录一、长尾理论二、协同过滤介绍1.基于用户的协同过滤算法(User-based CF,简称UserCF) 一、长尾理论 wiki链接:https://wiki.mbalib.com/wiki/%E9%95%BF%E5%B0%BE%E7%90%86%E8%AE%BA   长尾头部的商品往往代表了绝大多数用户的需求而长尾中的商品往往代表了一小部分用户的个性化需求。因此如果要通过发掘长尾来提高销售额就必须充分研究用户的个性化兴趣。而这正是个性化推荐系统主要解决的问题。   推荐系统通过发掘用户的行为找到用户 阅读详情

基于物品的协同过滤(ItemCF)核心原理: 通过分析用户行为数据来发现物品间的相似性关系。其核心假设是:被相同用户群体偏好的物品具有相似性。

标准实现流程:

  1. 构建物品相似度矩阵:基于用户-物品交互数据计算物品间相似度
  2. 生成候选集:针对用户已有偏好的物品,寻找与其相似的其他物品
  3. 推荐排序:综合用户历史偏好程度与物品相似度进行评分预测

典型应用场景:

  • 电商平台的"相关推荐"(如"购买了该商品的用户还买了...")
  • 个性化推荐模块(如"猜你喜欢")

核心价值主张: "物以类聚"——基于您已表现出兴趣的物品,推荐与其属性相似的其他物品。


1. 余弦相似度计算 

核心思想:将两个物品的评分看作多维空间中的两个向量,通过计算它们之间的夹角余弦值来判断相似度。夹角越小(余弦值越接近1),说明越相似。

#余弦相似度计算
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity  # 从sklearn导入余弦相似度计算工具


def calculate_item_similarity(item1, item2, user_ratings):
    # 1. 找出对 item1 评分过的所有用户ID
    users_with_item1 = set(uid for uid in user_ratings if item1 in user_ratings[uid])
    # 2. 找出对 item2 评分过的所有用户ID
    users_with_item2 = set(uid for uid in user_ratings if item2 in user_ratings[uid])

    # 3. 取交集:找到同时对这两个物品都评分过的用户
    common_users = users_with_item1 & users_with_item2

    # 4. 边界处理:如果没有共同评分用户,相似度返回0
    if len(common_users) == 0:
        return 0.0

    # 5. 构建向量:提取共同用户对 item1 和 item2 的评分
    vec1 = np.array([user_ratings[uid].get(item1, 0) for uid in common_users]).reshape(1, -1)
    vec2 = np.array([user_ratings[uid].get(item2, 0) for uid in common_users]).reshape(1, -1)

    # 6. 计算余弦相似度
    return cosine_similarity(vec1, vec2)[0][0]

适用场景:适合关注用户绝对评分偏好的场景。但它的缺点是:如果有个用户习惯打高分(比如全打5星),另一个习惯打低分(全打3星),即使他们对两个物品的相对喜欢程度一样,余弦相似度也会认为他们不相似。


2. 皮尔逊相关系数计算

核心思想:可以看作是“中心化”后的余弦相似度。它在计算前会先减去用户的平均评分,因此它衡量的是两个物品在评分趋势上的线性相关性,而不是绝对数值。

#皮尔逊相关系数
from scipy.stats import pearsonr  # 导入scipy中的皮尔逊相关系数计算工具

def calculate_pearson_similarity(item1, item2, user_ratings):
    # 1 & 2. 找出对 item1 和 item2 评分过的用户(这里用的是列表推导式)
    users_with_item1 = [uid for uid in user_ratings if item1 in user_ratings[uid]]
    users_with_item2 = [uid for uid in user_ratings if item2 in user_ratings[uid]]

    # 3. 转换为集合后取交集,找到共同用户
    common_users = set(users_with_item1) & set(users_with_item2)

    # 4. 边界处理:皮尔逊相关系数要求【至少有2个共同用户】才能计算(1个点无法形成趋势线)
    if len(common_users) < 2:
        return 0.0

    # 5. 构建评分向量
    ratings1 = [user_ratings[uid][item1] for uid in common_users]
    ratings2 = [user_ratings[uid][item2] for uid in common_users]

    # 6. 计算皮尔逊相关系数
    # pearsonr 返回两个值:第一个是相关系数,第二个是p-value(显著性)
    correlation, _ = pearsonr(ratings1, ratings2)
    return correlation

与余弦的区别:

  • 皮尔逊的门槛更高:要求至少2个共同用户。
  • 皮尔逊能消除用户评分尺度差异(比如上文提到的“严师”和“慈母”打分现象)。在推荐系统中,皮尔逊通常比余弦表现更好。

3. 矩阵分解计算

核心思想:不直接计算物品间的相似度,而是将巨大的、稀疏的“用户-物品评分矩阵”分解为两个小且稠密的矩阵:用户隐向量矩阵 和 物品隐向量矩阵。通过隐向量点积来预测评分。

#矩阵分解SVD
import numpy as np
import pandas as pd
from sklearn.decomposition import TruncatedSVD # 导入sklearn的SVD工具

def build_rating_matrix(user_ratings):
    """
    将嵌套字典形式的 user_ratings 转换为二维 numpy 矩阵,
    并返回矩阵以及用户和物品的ID列表,用于后续的索引映射。
    """
    # 将字典转换为 pandas DataFrame (行为用户,列为物品)
    df = pd.DataFrame.from_dict(user_ratings, orient='index')
    # 用 0 填充没有评分的空值
    df = df.fillna(0)

    # 保存用户和物品的ID顺序,这个顺序对应矩阵的行和列
    user_ids = df.index.tolist()
    item_ids = df.columns.tolist()

    return df.values, user_ids, item_ids


def train_svd_model(user_ratings, n_components=50):
    # 构建用户-景点评分矩阵,并获取ID列表
    rating_matrix, user_ids, item_ids = build_rating_matrix(user_ratings)

    # SVD分解
    svd = TruncatedSVD(n_components=n_components)
    user_factors = svd.fit_transform(rating_matrix)
    item_factors = svd.components_.T

    # 同时返回分解后的矩阵和ID列表
    return user_factors, item_factors, user_ids, item_ids


def predict_svd_rating(user_id, item_id, user_factors, item_factors, user_ids, item_ids):
    # 使用列表的 index 方法找到 user_id 和 item_id 在矩阵中的位置索引
    try:
        user_idx = user_ids.index(user_id)
        item_idx = item_ids.index(item_id)
    except ValueError:
        # 如果用户或物品不在训练数据中,返回一个默认值(例如0或平均分)
        print(f"警告:用户 {user_id} 或 物品 {item_id} 不在训练数据中。")
        return 0.0

    # 获取用户和物品的隐向量
    user_vec = user_factors[user_idx]
    item_vec = item_factors[item_idx]

    # 预测评分
    return np.dot(user_vec, item_vec)

适用场景:这是工业界最常用的推荐算法基础(如隐语义模型、深度学习推荐系统的底层思想)。它能极大地缓解数据稀疏性问题(即使两个物品没有共同评分用户,也能通过隐特征算出关联),计算效率高,扩展性极强。


对比与总结

算法解决的问题核心机制主要优缺点
余弦相似度物品相似度评估基于评分向量的夹角计算速度快;但易受用户打分绝对值影响(存在"严师效应")
皮尔逊相关系数物品趋势相似度评估基于均值调整后的向量夹角计算比余弦更准确,消除个人偏好;但需至少2个共同评分,数据稀疏时效果欠佳
矩阵分解(SVD)用户评分预测将评分矩阵分解为用户/物品特征向量性能最优,能挖掘深层关联,泛化能力强;缺点是模型解释性较差(难以解释提取的50个特征的具体含义)
基于物品的协同过滤(ItemCF)算法 基于物品的协同过滤算法在处理大规模数据集、提高推荐准确性和稳定性方面具有显著优势,但其在处理新物品、推荐多样性以及解释性方面存在不足。 阅读详情

相关推荐

基于物品的协同过滤算法(Item-CF)

一、算法思想。     基于物品的协同过滤算法,是给用户推荐和他之前喜欢的物品相似的物品。 基于物品的协同过滤算法,是目前广泛使用的一种推荐算法,像Netflix, YouTube, Amazon等。   二、算法步骤。 1、计算物品之间的相似度。 计算相似度的方法有以下几种: 基于余弦(Cosine-based)的相似度计算,通过计算两个向量之间的夹角余弦值来计算物品之间的

oucpowerman的博客 5022

基于物品的协同过滤算法(ItemCF)

1.定义   基于物品的协同过滤(item-based collaborative filtering)算法是目前业界应用最多的算法。ItemCF给用户推荐那些和他们之前喜欢的物品相似的物品,用户A 喜欢了一个物品s集合,那么推荐的时候就把与物品s集合里最相似的前N个物品推荐给用户A。ItemCF算法并不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为记录计算物品之间的相似度。该算...

jiangdongxiaobawang的博客 1万+

基于社交网络的用户与基于物品的协同过滤推荐算法-java

package WjPack; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.HashMap; publi

scnuxiaotao的博客 5743

推荐算法实战项目:物品协同过滤算法(ItemCF)原理以及案例实战(附完整 Python 代码)

协同过滤(collaborative filtering)是一种在推荐系统中广泛使用的技术。该技术通过分析用户或者事物之间的相似性,来预测用户可能感兴趣的内容并将此内容推荐给用户。这里的相似性可以是人口特征的相似性,也可以是历史浏览内容的相似性,还可以是个人通过一定机制给与某个事物的回应。比如,A和B是无话不谈的好朋友,并且都喜欢看电影,那么协同过滤会认为A和B的相似度很高,会将A喜欢但是B没有关注的电影推荐给B,反之亦然。

机器学习社区 9821

毕设项目:物品的协同过滤算法实现电影推荐系统(JSP+java+springmvc+mysql+MyBatis)

因此,开发一种能够根据用户历史行为和偏好来推荐电影的系统具有重要的现实意义和应用价值。物品的协同过滤算法是一种常用的推荐算法,它通过分析用户对物品的评价或者购买记录来进行推荐。在本研究中,我们将实现一个基于物品的协同过滤算法的电影推荐系统,旨在为用户提供更加个性化和准确的电影推荐服务。用户发送请求:用户通过浏览器或其他客户端向系统发送请求,请求访问特定的页面或执行特定的操作。前端展示结果:前端接收到后端返回的数据,根据需要进行展示。后端程序接收到请求后,根据请求的类型和参数进行相应的处理。

回明毕设项目 216

基于用户的协同过滤推荐算法原理和实现

在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单。该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤。一直到2000年,该算法都是推荐系统领域最著名的算法。       本文简单介绍基于用户的协同过滤算法思想以及原理,最后基于该算法实现园友的推荐,即根据你关注的人,为你推荐博客园中其他你有可能感兴趣的人。 基本思想

samjustin的博客 3万+

1.基于物品的协同过滤推荐算法理解

基于物品的协同过滤推荐算法可以概括为一下两个步骤: 计算物品之间的相似度 对用户的历史行为进行分析,计算物品相似度进而为用户产生推荐列表,我们可以利用如下的凡是对物品与物品之间的相似度进行计算: 其中N(i)表示喜欢物品i的用户数,N(j)表示喜欢物品j的用户数。       3. 从上面的公式中,我们可以看出,当两个物品同时被很多用户喜欢的时候,这两个物品也就有了相似度,换句话说就是用户的历史兴趣和爱好可以为喜欢的物品贡献相似度。所以再次就

Moneys的博客 998

基于物品的协同过滤推荐算法

基于物品的协同过滤推荐算法Mapreduce实现

基于物品的协同过滤算法

基础算法 (1) 计算物品之间的相似度。 (2) 根据物品的相似度和用户的历史行为给用户生成推荐列表。 购买了该商品的用户也经常购买的其他商品。从这句话的定义出发,我们可以用下面的公式定 义物品的相似度: 从上面的定义可以看到,在协同过滤中两个物品产生相似度是因为它们共同被很多用户喜 欢,也就是说每个用户都可以通过他们的历史兴趣列表给物品“贡献”相似度。这里面蕴涵着一 个假设,就是每个用户的兴趣...

江西师范大学-20届-吴悠 769

C语言编写Picard迭代和牛顿迭代法

为了完成学校计算方法的作业,花了两个多星期将所有实验报告编写出来,看到同桌找代码的辛苦,优快云也没有这类代码,我只是一时兴起,想分享我写的代码与大家共飨,有错误还请多多指正,代码都不难,也是为了让优快云帮我保存下,我辛辛苦苦做出来的,倘若能给别人带来一丝一毫的帮助,我都万分荣幸。 1:什么是Picard迭代 先弄一个满足f(x) = 0的函数将其转化为x= 正在上传… 重新上传 取消 ...

mohenxiang的博客 4699

AlphaFold2算法详解

正文:https://www.nature.com/articles/s41586-021-03819-2 补充文件:https://static-content.springer.com/esm/art%3A10.1038%2Fs41586-021-03819-2/MediaObjects/41586_2021_3819_MOESM1_ESM.pdfhttps://static-content.springer.com/esm/art%3A10.1038%2Fs41586-021-03819-2/Med

Daisy4的博客 1万+

基于协同过滤算法的图书推荐系统

随着信息时代的快速发展,图书资源日益丰富,用户在面临海量图书时往往难以快速找到符合自己兴趣和需求的书籍。因此,一个能够准确推荐图书的系统显得尤为重要。基于协同过滤算法的图书推荐系统正是为了解决这一问题而设计的。协同过滤算法是一种广泛应用于推荐系统的技术,它通过分析用户的历史行为、偏好和其他用户的数据,来预测用户对未接触过的图书的喜好程度。在图书推荐系统中,协同过滤算法可以分为用户基于协同过滤和物品基于协同过滤两种类型。

QQ80213251的博客 730

ATGM332D模块串口配置保姆级教程:从9600波特率到NMEA数据过滤,一次搞定

本文提供ATGM332D模块串口配置的详细教程,涵盖从基础硬件连接到高级NMEA数据过滤的全过程。内容包括波特率优化、数据输出频率调整、NMEA语句过滤等实用技巧,帮助开发者快速掌握GNSS模块配置,提升定位系统性能。

weixin_30664051的博客 513

基础的协同过滤算法

##ml_1m数据集下载地址: http://files.grouplens.org/datasets/movielens/ ##基于用户的协同过滤 import numpy as np import pandas as pd file = "ml-1m/ratings.dat" header = ["uid","iid","rating"] dtype = {"uid" :np.int32,"iid":np.int32,"rating":np.float32} data = pd.read_csv(fi

smallTutou的博客 1684

从仿真到实机:四足机器人控制算法的全流程验证框架

本文系统阐述了四足机器人从仿真到实机的全流程验证框架。针对仿真与实机环境的巨大差异,文章详细介绍了在MuJoCo等高保真仿真环境中的建模、算法迭代与压力测试方法,并重点解析了通过硬件抽象层和中间件搭建通往实机的关键桥梁。最后,提供了实机部署的安全清单与调试策略,旨在帮助开发者构建可重复、风险可控的算法验证闭环,提升算法在真实世界中的鲁棒性与可靠性。

lilh34434的博客 381

第四章 自定义组件、动画

第三章 自定义组件、动画 (一)自定义View 1.1) onMeasure:对当前View的尺寸进行测量 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) widthMeasureSpec和heightMeasureSpec包含测量模式和尺寸大小 int widthMode = MeasureSpec....

Stay Hungry Stay Foolish 求知若饥 虚心若愚 8130

MapReduce基于物品的协同过滤算法实现电影推荐系统

项目源码见本人上传资源文件中 ##MapReduce实现电影推荐系统 ###案例分析 互联网某电影点评网站,主要产品包括 电影介绍 电影排行 网友对电影打分 网友影评 影讯&购票 用户在看|想看|看过的电影 猜你喜欢(推荐) 利用用户对电影的打分表来给用户推荐电影,用户打分表包括以下字段 userID--用户ID号 itemID--电影ID号 ...

weixin_40903057的博客 3489

Labview数据存储与读取——TDMS文件的创建与写入

Labview数据存储与读取——TDMS文件的创建与写入 你好,这是我在自学Labview编写软件过程中使用的一些功能。我在存储采集卡数据时,通过阅读大量他人的程序,发现TDM及TDMS文件十分适合波形数据的记录,TDMS文件比TDM文件在存储动态类型数据时读写速度更快,而且TDMS 文件没有容量限制,适合存储数据量庞大的测试数据。 前言少叙,书归正传 这一篇博客,说明一下如何使用基本的TDMS功能实现数据文件的存储。 所需要的控件如上图所示,在程序框图——编程——文件I\O——TDMS 中,写入TDMS

滑板小帅程序开发 2万+

协同过滤算法_协同过滤在新闻推荐CTR预估中的应用

概述协同过滤算法是推荐系统中的最基本的算法,该算法不仅在学术界得到了深入的研究,而且在工业界也得到了广泛的应用。本文介绍最基本的基于物品的和基于用户的协同过滤算法,并结合新闻推荐的CTR预估,介绍基于物品的协同过滤算法在CTR预估的抽取数据特征中的应用。基于物品的协同过滤算法基于物品的协同过滤算法(以下简称ItemCF)是目前工业界应用最多的算法。ItemCF的基本原理是给用户推荐那些和他们之前喜...

weixin_39867142的博客 518

计算机组成原理课程设计_微程序控制的简单模型机设计

微程序控制的简单模型机设计 要求 基本要求 完成一个简单主机的设计,模型机应具备如下能力:在自行设计的指令集基础上,运行自行编写的简单用户程序,实现特定运算功能。 弹性要求 在此基础上,完成必要的扩展,实现模型机的功能扩展设计,包括:实现多种运算功能(指令集的扩充)、支持更为丰富的寻址方式、有更为完善的微程序设计等。 实验软件和硬件环境 QuartusII, FPGA计算机组...

sailist的记录站 3万+

假期搞定!2026国社科申报AI全攻略指南:从选题到创新,7大核心要点手把手教你!

最后给大家推荐的400多所高校教师都在用的AI平台——高级学术版专业应用平台,集成了国际主流学术应用,以及ChatGPT、Claude、Gemini、Grok等Al大模型的高级版本平台,还有,可以辅助大家高效完成科研和学术写作任务,当然撰写硕博论文,课题、职称论文、国社科、国自然基金本子也是手拿把掐。你的任务是:用高度凝练的方式说明在(某一明确国家战略 / 政策方向,如:中国式现代化、共同富裕、基层治理现代化、数字中国、文化强国、国家安全等)背景下,我究竟要研究一个什么“具体而可操作的问题”。

智能AI让学术科研更容易 623

协同过滤算法的小区闲置物品租赁系统源码 Java+SpringBoot+Vue 前后分离

本项目开发了一个基于协同过滤算法的小区闲置物品租赁系统,采用SpringBoot2.0+Vue2.0技术栈实现。系统包含21张数据库表,提供物品租赁、订单管理、押金退还等全流程功能,通过协同过滤算法实现个性化物品推荐。前端采用Element-ui构建清爽界面,后端基于Java+MyBatis开发,支持MySQL5.7+数据库。配套提供完整源码、部署教程及测试环境配置(JDK1.8+Maven3.6.3+Node14),适合社区闲置资源共享场景,实现资源循环利用的数字化管理。

2502_92727985的博客 194

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

推荐算法的Python实现——ItemCF(基于物品的协同过滤)

1. 数据集 本博客用Movielens-1m数据集的ratings.dat作为推荐数据来训练UserCF推荐模型。第一列是用户id(user_id)、第二列是物品id(item_id)、第三列是用户对物品的评分(score)、第四列是时间戳(timestamp)。 在Movielens-1m的元素数据集中,ratings.dat是用::作为分隔符的。在本次的python实现中,提前将分隔符::替换为了,,文件名ratings.dat改为了ratings.csv。 如果嫌麻烦不想该,改代码也可以,主要替换

白水的博客 5444

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

基于物品 的协同过滤推荐算法(ItemCF)

。首先给用户行为定义相应的权重积分 。算法思路:给用户推荐那些和他们之前喜欢的物品相似的物品     实例如下:       算法步骤:     (1) 余弦相似度计算计算逻辑,以物品1和物品2为例;       计算得:         对比评分矩阵,对于已经推荐过的物品要去除推荐  去除推荐就是置为0,并且选出评分最高的

Jaker的博客 8686

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

协同过滤算法

协同过滤算法: 收集用户偏好 找到相似的用户或商品 计算推荐 相似度计算 1.欧氏距离 2.欧几里德距离 3.皮尔逊相关系数(1111 协方差 标准差 皮尔逊相关系数=协方差/标准差 趋近于-1负相关,趋近于1正相关 4.Cosine相似度 基于用户的协同过滤(不太流行 要解决的问题 已知用户的评分矩阵 推断矩阵中空格的值 存在的问题: 新用户 物品没被打分 解决方案 相似度计...

wwt的博客 376

协同过滤推荐算法_基于物品的协同过滤推荐算法2001

Item-Based Collaborative Filtering Recommendation Algorithms[1]摘要推荐系统对于个性化推荐很有必要,基于用户的协同过滤很成功。然而随着信息和用户数量的爆炸式增长,推荐系统现在面临着一些挑战:生成高质量的推荐,对百万量级的用户和物品实时响应,在数据稀疏的情况下实现高覆盖。因此,本文研究了不同的基于物品的协同过滤算法,并通过实验对这些算法进...

weixin_39925031的博客 441
上一篇: 【游戏设计】【UI设计】游戏UI设计专题笔记
下一篇: 基于物品的协同过滤算法(2)
解决小子
博客等级 码龄5年 37粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

解决小子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值