# 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)------基于协同过滤的个性化推荐算法实战---隐语义模型 的相关文章

  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • Python 中的二进制缓冲区

    在Python中你可以使用StringIO https docs python org library struct html用于字符数据的类似文件的缓冲区 内存映射文件 https docs python org library mmap
  • python pandas 中的双端队列

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 如何将 PIL 图像转换为 NumPy 数组?

    如何转换 PILImage来回转换为 NumPy 数组 这样我就可以比 PIL 进行更快的像素级转换PixelAccess允许 我可以通过以下方式将其转换为 NumPy 数组 pic Image open foo jpg pix numpy
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 对输入求 Keras 模型的导数返回全零

    所以我有一个 Keras 模型 我想将模型的梯度应用于其输入 这就是我所做的 import tensorflow as tf from keras models import Sequential from keras layers imp
  • 从 Python 中的类元信息对 __init__ 函数进行类型提示

    我想做的是复制什么SQLAlchemy确实 以其DeclarativeMeta班级 有了这段代码 from sqlalchemy import Column Integer String from sqlalchemy ext declar
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql

随机推荐

  • [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 需要给他们推荐和他们已经