# Python推荐系统学习笔记(3)------基于协同过滤的个性化推荐算法实战---隐语义模型

2023-11-03

Python推荐系统学习笔记(3)------基于协同过滤的个性化推荐算法实战—隐语义模型

一、概念性理解

传统的推荐方法
UserCF,首先需要找到和他们看了同样书的其他用户,然后给他们推荐那些用户喜欢的其他书。
ItemCF,需要给他们推荐和他们已经看的书相似的书。
基于隐语义模型
通过矩阵分解建立用户和隐类之间的关系,物品和隐类之间的关系,最终得到用户对物品的偏好关系。
隐语义模型(LFM):通过矩阵分解建立用户和隐类之间的关系,物品和隐类之间的关系,最终得到用户对物品的偏好关系。
隐含语义分析技术的分类来自对用户行为的统计,代表了用户对物品分类的看法,是基于用户的共同兴趣计算出来的,允许我们指定最终有多少个分类,会计算出物品属于每个类的权重,因此每个物品都不是硬性地被分到某一个类中。
隐含语义分析技术从诞生到今天产生了很多著名的模型和方法,其中和该技术相关且耳熟能详的名词有pLSA、LDA、隐含类别模型(latent class model)、隐含主题模型(latent topic model)、 矩阵分解(matrix factorization)。这些技术和方法在本质上是相通的,其中很多方法都可以用于个性化推荐系统。
假设我们想要发现 F个隐类,我们的任务就是找到两个矩阵 U 和
V,使这两个矩阵的乘积近似等于R,即将用户物品评分矩阵 R 分解成为两个低维矩阵相乘,然后定义损失函数,利用随机梯度下降法处理损失函数,求出U和V。

二、矩阵分解的基本思想

矩阵分解的基本思想简单来说就是每一个用户和每一个物品都会有自己的一些特性,特性即可作为隐语义模型的隐含因子,用矩阵分解可以从评分矩阵中分解出用户–特性矩阵,物品–特性矩阵,这样一是得到了用户的偏好和每件物品的特性,二是知道了矩阵的维度。
矩阵分解就是把原来的大矩阵,近似的分解成小矩阵的乘积,在实际推荐计算时不再使用大矩阵,而是使用分解得到的两个小矩阵。
具体来说就是,假设用户物品的评分矩阵Y是m乘n维,即一共有m个用户,n个物品.通过一套算法转化为两个矩阵U和V,矩阵U的维度是m乘k,矩阵V的维度是n乘k。
在这里插入图片描述
类似这样的计算过程就是矩阵分解,还有一个更常见的名字SVD,但是SVD和矩阵分解不能划等号,因为除了SVD还有一些别的矩阵分解方法。

三、算法的深层次理解

**基础的SVD算法:**矩阵分解,就是把用户和物品都映射到一个K维空间上,这个k维空间不是直接看到的,通常称为隐因子。
每一个物品都得到一个向量,每一个用户也得到一个向量。对于物品,与它对应的向量中的元素,有正有负,代表着这个物品背后暗藏的一些用户关注的因素,对于用户,与它对应的向量中的元素,也有正有负,代表这个用户在若干因素上的偏好。物品被关注的因素和用户偏好的因素,它们的数量和意义是一致的,就是我们在矩阵分解之处人为指定的。
如何得到每一个用户,每一个物品的维向量,这是一个机器学习的问题。按照机器学习思想,一般考虑两个要素:1)、损失函数 2)、优化算法。
整个SVD的学习过程就是:
1)准备好用户物品的评分矩阵,每一条评分数据看作是一条训练样本;
2)给分解后的U矩阵和V矩阵随机初始化元素值;
3)用U和V计算预测后的分数;
4) 计算预测的分数和实际的分数误差;
5)按照梯度下降的方向更行U和V中的元素值;
6)重复步骤3到5,直到达到停止条件。
得到分解后的矩阵之后,实质上就是得到每个用户和每个物品的隐因子向量,拿着这个向量再做推荐计算更加简单,简单来说就是拿着物品和用户两个向量,计算的点积就是推荐分数。

四、以用户与电影间的关系进行举例说明

每个用户看电影的时候都有偏好,这些偏好可以直观理解成:恐怖片,喜剧片,武侠片,爱情片等,称作电影特性。用户–特性矩阵表示的就是用户对这些因素(偏好)的喜欢程度。
在这里插入图片描述
同样,每一部电影也可以用这些因素描述,因此物品–特性矩阵表示的就是每一部电影这些因素的含量,也就是电影的类型。这样子两个矩阵相乘就会得到用户对这个电影的喜欢程度。
在这里插入图片描述
因为传统的矩阵分解技术不能完成矩阵的分解,即使能分解,那样计算复杂度太高,不现实。因此通常的方法是使用已存在评分计算出预测误差(或代价函数),然后使用梯度下降算法调整参数使得误差(代价函数)最小。
戴帽子的rui表示预测u对i的打分,qi表示i物品每个特性的归属度向量,表示用户u对每个特性的喜欢程度的向量。因此,物品的预测得分为:
在这里插入图片描述
下面就根据已有的数据计算误差并修正q和p使得误差最小,(SVD损失函数)误差的表示方式如下:
在这里插入图片描述
根据上面的参数可以得到电影推荐系统的误差实际计算公式如下:
在这里插入图片描述
J(X,O) 即代表该方法的代价函数(误差);r是用户对电影的评分记录表(矩阵),在其中,具有评分的记录用1表示,没有则用0表示,故 r(i,j) 代表了一种过滤条件,即 i用户对 j 电影具有评分;oi 代表i用户的喜好向量(对不同类型电影的喜欢程度值),xj代表了j电影的内容(即一个电影的各个特征类型如喜剧片恐怖片等所占数值,如(0.2,0.2,0.4,0.1)的转置,y(i,j) 是i用户对j电影的实际评分。后面两项是正则化项,是特征数量即电影特性(喜剧片,爱情片等)的数量,m是电影总数, u是用户总数。oiTxj即为 i 用户对电影的评分预测值。

五、实现隐语义模型,对隐式数据进行推荐

代码和解析见隐语义模型分析关键代码.py。

# -*- coding: utf-8 -*-
'''
实现隐语义模型,对隐式数据进行推荐
1.对正样本生成负样本
  -负样本数量相当于正样本
  -物品越热门,越有可能成为负样本
2.使用随机梯度下降法,更新参数
'''
import numpy as np#numpy库可以用来存储和处理大型矩阵
import pandas as pd#pandas提供了大量能使我们快速便捷地处理(分析)数据的函数和方法
from math import exp#exp() 方法返回x的指数,e^x
import time
import math
from sklearn import model_selection#sklearn是python的机器学习库,其中封装了大量的机器学习算法,内置了大量的公开数据集.
#train_test_split返回切分的数据集train/test;cross_validate返回train/test数据集上的每折得分
import random
import operator#操作符函数接口
class LFM:
    '''
            初始化隐语义模型
            参数:*data 训练数据,要求为pandas的dataframe
       *F  隐特征的个数      *N  迭代次数        *alpha 随机梯度下降的学习速率
       *lamda 正则化参数  *ratio 负样本/正样本比例  *topk 推荐的前k个物品
    '''
    def __init__(self, data, ratio, F=5, N=2, alpha=0.02, lamda=0.01, topk=10):
        self.data = data  # 样本集
        self.ratio = ratio  # 正负样例比率,对性能最大影响
        self.F = F  # 隐类数量,对性能有影响
        self.N = N  # 迭代次数,收敛的最佳迭代次数未知
        self.alpha = alpha  # 梯度下降步长
        self.lamda = lamda  # 正则化参数
        self.topk = topk  # 推荐top k项
    '''
        初始化物品池,物品池中物品出现的次数与其流行度成正比
    {item1:次数;item2:次数,...}
    '''
    def InitItemPool(self):
        itemPool = dict()#定义物品池里面的物品和流行度为字典模型
        groups = self.data.groupby([1])#groupby分组聚合数据
        for item, group in groups:
            itemPool.setdefault(item, 0)#Python字典setdefault()函数和get()方法类似, 如果键不存在于字典中,将会添加键并将值设为默认值。
       
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

# Python推荐系统学习笔记(3)------基于协同过滤的个性化推荐算法实战---隐语义模型 的相关文章

  • 错误:process_executor.py:702: ... 当一些作业被分配给执行器时,工作人员停止了。这可能是由于工作超时太短造成的

    根据主题中的错误 修复方法是什么 环境 Python 3 9 或 3 10 Windows 10 x64 使用时出现错误joblib https joblib readthedocs io en latest 对于并行处理 result c
  • 如何在多进程系统中实现锁定?

    我们正在并行运行许多詹金斯项目 我们使用 python 并且选择使用 pyenv 管理虚拟环境 不幸的是 pyenv 有一个众所周知的竞争条件 https github com yyuu pyenv issues 174 为了解决这个问题
  • 获取 .wav 文件长度或持续时间

    我正在寻找一种方法来找出 python 中音频文件 wav 的持续时间 到目前为止我已经了解了 pythonwave图书馆 mutagen pymedia pymad我无法获取 wav 文件的持续时间 Pymad给了我持续时间 但它不一致
  • 如何使用 Python 3 绕过 HTTP Error 403: Forbidden with urllib.request

    您好 不是每次都这样 但有时在尝试访问 LSE 代码时 我会收到每一个烦人的 HTTP 错误 403 禁止消息 任何人都知道我如何仅使用标准 python 模块来克服这个问题 遗憾的是没有漂亮的汤 import urllib request
  • 稀有对象的 python 类型注释,例如 psycopg2 对象

    我了解内置类型 但是我如何指定稀有对象 例如数据库连接对象 def get connection and cursor gt tuple psycopg2 extensions cursor psycopg2 extensions conn
  • 在python中将数据库表写入文件的最快方法

    我正在尝试从数据库中提取大量数据并将其写入 csv 文件 我正在尝试找出最快的方法来做到这一点 我发现在 fetchall 的结果上运行 writerows 比下面的代码慢 40 with open filename a as f writ
  • 将 numpy 数组合并为单个 int

    numpy 数组怎么可以这样 10 22 37 45 转换为单个 int32 数字 如下所示 10223745 这可以工作 gt gt gt int join map str 10 22 37 45 10223745 基本上你使用map s
  • Matplotlib:如何有效地将大量线段着色为独立渐变

    Python 绘图库 如何有效地将大量线段着色为独立渐变 已经 阅读this https stackoverflow com questions 8500700 how to plot a gradient color line in ma
  • 如何通过 python 多处理利用所有核心

    我一直在摆弄Python的multiprocessing现在已经使用了一个多小时的功能 尝试使用并行化相当复杂的图形遍历函数multiprocessing Process and multiprocessing Manager import
  • 创建上下文后将 jar 文件添加到 pyspark

    我正在笔记本上使用 pyspark 并且不处理 SparkSession 的创建 我需要加载一个包含一些我想在处理 rdd 时使用的函数的 jar 您可以使用 jars 轻松完成此操作 但在我的特定情况下我无法做到这一点 有没有办法访问sp
  • Python Anaconda:如何测试更新的库是否与我现有的代码兼容?

    我在 Windows 7 机器上使用 Python 2 7 Anaconda 安装进行数据分析和科学计算 当新的库发布时 例如新版本的 pandas patsy 等 您建议我如何测试新版本与现有代码的兼容性 是否可以在同一台机器上安装两个
  • 查找 Pandas DF 行中的最短日期并创建新列

    我有一个包含多个日期的表 有些日期将为 NaN 我需要找到最旧的日期 所以一行可能有 DATE MODIFIED WITHDRAWN DATE SOLD DATE STATUS DATE 等 因此 对于每一行 一个或多个字段中都会有一个日期
  • 是否需要关闭没有引用它们的文件?

    作为一个完全的编程初学者 我试图理解打开和关闭文件的基本概念 我正在做的一项练习是创建一个脚本 允许我将内容从一个文件复制到另一个文件 in file open from file indata in file read out file
  • 在Raspberry pi上升级skimage版本

    我已经使用 Raspberry Pi 2 上的 synaptic 包管理器安装了 python 包 然而 skimage 模块版本 0 6 是 synaptic 中最新的可用版本 有人可以指导我如何将其升级到0 11 因为旧版本中缺少某些功
  • 检测是否从psycopg2游标获取?

    假设我执行以下命令 insert into hello username values me 我跑起来就像 cursor fetchall 我收到以下错误 psycopg2 ProgrammingError no results to fe
  • 如何在亚马逊 EC2 上调试 python 网站?

    我是网络开发新手 这可能是一个愚蠢的问题 但我找不到可以帮助我的确切答案或教程 我工作的公司的网站 用 python django 构建 托管在亚马逊 EC2 上 我想知道从哪里开始调试这个生产站点并检查存储在那里的日志和数据库 我有帐户信
  • AWS Lambda 不读取环境变量

    我正在编写一个 python 脚本来查询 Qualys API 中的漏洞元数据 我在 AWS 中将其作为 lambda 函数执行 我已经在控制台中设置了环境变量 但是当我执行函数时 出现以下错误 module initialization
  • 如何将带有参数的Python装饰器实现为类?

    我正在尝试实现一个接受一些参数的装饰器 通常带有参数的装饰器被实现为双重嵌套闭包 如下所示 def mydecorator param1 param2 do something with params def wrapper fn def
  • Django 管理器链接

    我想知道是否有可能 如果可以的话 如何 将多个管理器链接在一起以生成受两个单独管理器影响的查询集 我将解释我正在研究的具体示例 我有多个抽象模型类 用于为其他模型提供小型的特定功能 其中两个模型是DeleteMixin 和GlobalMix
  • 将 Keras 集成到 SKLearn 管道?

    我有一个 sklearn 管道 对异构数据类型 布尔 分类 数字 文本 执行特征工程 并想尝试使用神经网络作为我的学习算法来拟合模型 我遇到了输入数据形状的一些问题 我想知道我想做的事情是否可能 或者我是否应该尝试不同的方法 我尝试了几种不

随机推荐

  • [Python人工智能] 十四.循环神经网络LSTM RNN回归案例之sin曲线预测

    从本专栏开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前一篇文章详细讲解了如何评价神经网络 绘制训练过程中的loss曲线 并结合图像分类案例讲解精确率 召回率和F值的计算过程 本篇文章将分享循环神经网络LSTM R
  • java文件的上传和下载_java文件上传和下载

    在web项目中上传文件夹现在已经成为了一个主流的需求 在OA 或者企业ERP系统中都有类似的需求 上传文件夹并且保留层级结构能够对用户行成很好的引导 用户使用起来也更方便 能够提供更高级的应用支撑 文件夹数据表结构 CREATETABLEI
  • 注解-宋红康

    目录 一 注解 Annotation 概述 二 常见的注解实例 三 如何自定义注解 四 JDK中的四个元注解 五 Java8注解的新特性 1 可重复注解 2 类型注解 一 注解 Annotation 概述 二 常见的注解实例 三 如何自定义
  • Android开发入门组件(十)——WebView

    今天主要写一下WebView 主要是在安卓应用的页面来加载或者写入网页 是比较常见的一种操作 加载网页 1 加载url 网络或者本地assets文件下的html文件 1 加载网络url webview loadUrl 相应的网址 直接在ac
  • 从外包辞职了,600小时后,我入职了字节跳动

    前言 没有绝对的天才 只有持续不断的付出 对于我们每一个平凡人来说 改变命运只能依靠努力 幸运 但如果你不够幸运 那就只能拉高努力的占比 2022年7月 我有幸成为了字节跳动的一名Java后端开发 相信同行都清楚 从外包进大厂有多难 运气之
  • c# --- 泛型解决输入和输出类型不确定问题

    一 背景 有这样一个需求 一个方法 他的返回值类型不确定 方法参数的类型不做要求 二 思考 返回值类型不确定 从继承的角度 所以类都是object的子类 返回object即可 但是这种方法是类型不安全的 需要进行类型转换 我们可以使用泛型解
  • HTML <small> 标签

    定义和用法
  • CUBLAS矩阵乘法

    include
  • Winsock属性 方法介绍

    本文章已收录于 Winsock是Mcrosoft windows提供的网络编程接口 它供了基于TCP IP协议接口实现方法 通过网络进行的数据通信 需要用地址来表示网络中的主机 TCP IP协议使用IP地址来作为主机的标识 实现的连接方式是
  • 关于connect: network is unreachable 问题的解决

    由于发现原创文章 在未署名作者及出处的情况下被转载 在以后所有的原创文章开头我都会写明作者和出处 希望朋友们以后在转载本博客原创博文时注意标明文章作者及出处 作者 liukun321 咕唧咕唧 原文出处 http blog csdn net
  • 牛客面试题库(9)

    请你说说索引怎么实现的B 树 为什么选这个数据结构 说到B 树 一般和B树做对比 都是多叉树 B 数组叶子结点存储数据 其他节点存储索引 而B树每个节点都存储数据 B 树叶子结点内通过单向链表连接 节点和节点之间通过双向链表连接 从磁盘IO
  • 匿名内部类的定义格式

    匿名内部类 1 使用条件 如果接口的实现类 或者父类的子类只需要使用唯一的一次 那么就可以省略该类的定义 改用匿名内部类 2 定义格式 接口名称 对象名 new 接口名称 覆盖重写所有抽象方法 分号不要忘 3 对匿名内部类的格式 new 接
  • springboot + mybatis启动时执行sql脚本

    目录 1 创建数据版本表 结构如下 2 创建HdVersion对象 3 创建执行sql的dao 4 创建dao对应的xml 5 创建sql执行器 实现ApplicationRunner 6 结语 背景 项目开发或发布阶段修改表结构 项目更新
  • 大数据平台测试-白盒测试静态方法解析(我奶奶都能看懂)

    软件测试从某种维度上分为黑盒测试和白盒测试 黑盒测试更多的是增啥改查 也就是功能测试 关于功能测试参考这里 增删改查测试场景 菜市场的大妈都能看懂 关于白盒测试的资料参考这里 白盒测试案例设计 我爷爷都能看懂 注意并不是说白盒测试一定就是要
  • 还不会python 实现常用的数据编码和对称加密?看这篇文章就够啦~

    前 言 相信很多使用 python 的小伙伴在工作中都遇到过 对数据进行相关编码或加密的需求 今天这篇文章主要给大家介绍对于一些常用的数据编码和数据加密的方式 如何使用 python 去实现 话不多说 接下来直接进入主题 1 base64
  • Unity—关节、布料、角色控制器、视频播放

    开学啦 接下来学习Unity的寻路系统和射线 结尾有彩蛋呦 每日一句 少年特有的放浪不羁是青春的定义 目录 关节 布料 视频播放 Character Controller组件 关节 铰链关节 Hinge Joint 将两个刚体 Rigidb
  • jenkins fastlane淌坑记录

    目录 前言 管理证书 使用证书 构建命令 关于app托管 iOS的版本自增 testflight上传 fastlane下苹果的账号验证问题 iOS缓存问题 iOS打包会开启8081服务 fastlane获取最新代码 Fastlane完整代码
  • CSRF漏洞详解

    目录 一 CSRF漏洞原理 1 基本原理 2 流程图 3 条件 二 分类 1 GET型 2 POST型 三 危害 四 检测与防御 1 检测 2 防御 一 CSRF漏洞原理 1 基本原理 CSRF Cross site Request For
  • linux用c++获取mac地址,网卡地址,网口地址,网卡序号ip地址,不使用 ioctl(sock, SIOCGIFCONF, &ifc)获取网络接口名称,这个接口有时会返回-1获取不到,换方法获取

    linux用c 获取mac地址 不使用 ioctl sock SIOCGIFCONF ifc 获取网络接口名称 这个接口有时会返回 1获取不到 换方法获取 1 弃用 SIOCGIFCONF 获取网络接口名称列表 获取所有网络接口列表 ifc
  • # Python推荐系统学习笔记(3)------基于协同过滤的个性化推荐算法实战---隐语义模型

    Python推荐系统学习笔记 3 基于协同过滤的个性化推荐算法实战 隐语义模型 一 概念性理解 传统的推荐方法 UserCF 首先需要找到和他们看了同样书的其他用户 然后给他们推荐那些用户喜欢的其他书 ItemCF 需要给他们推荐和他们已经