使用带有示例和代码的因式分解机的推荐系统

news2024/12/28 3:04:42

一、说明

        在我之前的文章中,我讨论了推荐系统的基础知识、矩阵分解和神经协同过滤 (NCF),您可以在下面的“我的博客”部分找到它们。接下来,这次我将通过示例和代码来探索因式分解机器。

        将因子分解机用于推荐系统的一些优点是

  • 它相对很好地处理稀疏和高维数据。
  • 您可以在用户和项目周围添加元信息以获得更多上下文。因此,因子分解机不是像NCF和矩阵分解那样仅使用用户-项目交互的纯协同过滤方法。

        因子分解机是一种受监督的ML算法,可用于分类和回归。虽然,它以推荐系统而闻名。也

它可以被视为线性回归的扩展,除了捕获线性关系外,

通过使用潜在分解引入高阶特征交互,也可以捕获高阶关系。

二、什么是高阶特征交互?

        高阶交互作用是指两个或多个特征对目标变量的综合效应,其中影响不是线性的,不能用单个特征效应的总和来表示。例如

假设我们有用户是否会点击广告的分类数据。功能集具有

用户 ID、用户年龄、广告类型、广告 ID、点击与否(标签)

我们可能会发现,“广告类型”对用户点击广告的可能性的影响取决于“用户年龄”。例如,年轻用户可能更有可能点击图片广告,而年长用户可能更喜欢视频广告。这种互动意味着“广告类型”的影响并非在所有年龄段都一致。为了捕捉这种高阶互动,模型需要考虑“广告类型”和“用户年龄”如何相互作用以影响点击率。

因子分解机可以帮助我们捕获线性回归忽略的高阶交互作用。

        FM 模型方程包含不同阶次特征之间的 n 向交互作用。最普遍的配置是二阶模型,它包含数据集中单个特征的权重和每对特征的交互作用项。我将在这篇文章中解释双向交互。

三、它是如何实施的?让我们用一个例子来理解

        假设我们有以下用户-项交互数据

        如您所见,除了用户-项目交互之外,它还具有有关用户和项目的一些元信息。

  • 独热编码数据集中存在的分类特征。这将包括用户(用户ID)和项目(电影ID)列的One-Hot En编码以及标签(评级)列除外。

四、因式分解机方程

y = w₀ + ∑(wi * xi) + ∑i(∑j(<vi . vj> * xi * xj))

哪里

y = 标签

w₀ = 偏差

wi = 权重

xi = 来自 One-Hot 编码特征集的功能

<六.vj> = 潜在向量之间的点积

注意:如果忽略第 3 项,则第 1 项将形成线性回归方程

  • 前两项类似于线性回归,其中 w₀=bias 和
  • wi * xi 捕获每个 One-Hot-Encoding 特征的权重。
  • 第 3 项对于捕获高阶交互很重要

∑i(∑j(<vi . vj> * xi * xj)),我们将在One-Hot Encoding 所有特征以及点积之后获得的每一列相乘这些 OHE 列的潜在向量表示之间。

假设我们有 2 个功能,年龄和流派,其中流派有两个可能的值:动作和喜剧,那么 FM 中 One-Hot 编码流派(Genre_Action 和 Genre_Comedy)之后的第 3 个术语将如下所示

<v_age .v_age> * 年龄 * 年龄 +

<v_genre_action .v_genre_action> * genre_action* genre_action+

<v_genre_comedy .v_genre_comedy> * genre_comedy* genre_comedy+

<v_age .v_genre_action> * 年龄 * genre_action +

<v_age .v_genre_action>年龄 * genre_comedy +

<v_genre_action .v_genre_comedy> * genre_comedy* genre_action

在这里,您可以看到,对于每对可能的 OHE 列,我们将有一个项,捕获它们的相互作用以及它们的潜在向量表示。由于“流派”有两个可能的值,因此它被分成两列。 “年龄”是数字,因此此列没有 OHE。因此,对于 3 列,我们得到了 6 种不同的组合

W₀、WI 和 VI 是模型在训练过程中将学习的实体。

最后一个疑问

为什么我们在第三项中不使用权重矩阵代替潜在向量?还是潜在向量类似于某些权重矩阵?

潜在向量与权重矩阵不同。它们的尺寸通常较小。

这样做是因为潜在向量的数量通常远小于在第 3 项中形成的唯一特征组合的数量。这在处理高维数据集时特别有利,因为完整的权重矩阵将变得计算昂贵且占用大量内存。

数学够了,是时候采取行动了

首先,我们需要一个虚拟数据集。我们将使用具有 10 个特征的 sklearn.datasets 创建一个。

注意: 此示例适用于任何类型的分类。对于推荐,整个过程保持不变

#pip install git+https://github.com/coreylynch/pyFM

import numpy as np
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
from pyfm import pylibfm

from sklearn.datasets import make_classification

X, y = make_classification(n_samples=100000,n_features=10, n_clusters_per_class=1)

让我们看看我们的训练数据集

和标签

  • 接下来,我们将使用加载的数据集创建一个字典,其中特征名称作为键,相应的值作为值。训练数据集的每一行将由一个这样的字典表示
data = [ {v: k for k, v in dict(zip(i, range(len(i)))).items()}  for i in X]

列车测试拆分时间

X_train, X_test, y_train, y_test = train_test_split(data, y, test_size=0.1, random_state=42)
  • 现在,正如在因子分解机中所讨论的,我们将把所有特征转换为One-Hot向量。这将使用DictVectorizer完成。这将产生一个稀疏矩阵
v = DictVectorizer()
X_train = v.fit_transform(X_train)
X_test = v.transform(X_test)

接下来,让我们训练因子分解机并分析测试数据的结果

fm = pylibfm.FM(num_factors=50,num_iter=10, verbose=True, task="classification", initial_learning_rate=0.0001, learning_rate_schedule="optimal")

fm.fit(X_train,y_train)

# Evaluate
from sklearn.metrics import log_loss,accuracy_score
print("Validation log loss: %.4f" % log_loss(y_test,fm.predict(X_test)))
print("Validation accuracy: %.4f" % accuracy_score(y_test,np.where(fm.predict(X_test)<0.5,0,1)))

上面显示的实现非常简单。但是,您应该考虑调整几个关键的超参数

num_factors:潜在向量的大小 (v)。尺寸越大,它可以捕获的复杂性就越高,但计算和内存量很大。

任务:分类(隐式反馈)/回归(显式反馈)任务

下面附的屏幕截图描述了培训的进行情况

如您所见,我们在logloss=97.0时达到了097%的准确率,这很棒!!

许多其他库也提供了因子分解机的实现,如xlearn,fastFM等,你可以尝试一下。梅胡尔·古普塔

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch无法使用cuda

import torch # 如果pytorch安装成功即可导入 print(torch.cuda.is_available()) # 查看CUDA是否可用 print(torch.cuda.device_count()) # 查看可用的CUDA数量 print(torch.version.cuda) # 查看CUDA的版本号#False #0 #None 表明安装失败&#xff01;查看安装包&#xff1a;…

Gin框架---基础综述

目录 一&#xff1a;经典入门案例二&#xff1a;请求参数2.1: API参数2.2: URL参数2.3: 表单参数 三&#xff1a; 响应参数四&#xff1a;数据解析和绑定4.1: JSON数据解析绑定4.2: FROM表单数据解析和绑定 五&#xff1a; 路由组六&#xff1a;异步处理七&#xff1a;中间件7.…

【UE】刀光粒子效果——part1

效果 步骤 1. 打开3dsmax&#xff0c;首先新建一个管状体 转成可编辑多边形后&#xff0c;删除多余的面&#xff0c;只保留一层 选择内圈将其拉高5mm 在修改器列表中添加“UVW展开” 点击打开“UV编辑器” 选中左边所有的顶点 将其拖拽到最左边 将右边的点拖拽到最右边 关闭 “…

VR古迹复原——数字化复原圆明园,开创文化遗产保护新方式

圆明园是中国历史上一处重要的文化遗产&#xff0c;曾经被誉为“万园之园”&#xff0c;但在1860年的英法联军侵华战争中被毁。近年来&#xff0c;虚拟现实技术不断发展&#xff0c;广州华锐互动利用VR全景技术复原了圆明园&#xff0c;通过VR设备&#xff0c;人们可以在家中就…

浏览器面试题

浏览器面试题 1.常见的浏览器内核有哪些&#xff1f;2.浏览器的主要组成部分有哪些&#xff1f;3.说一说从输入URL到页面呈现发生了什么&#xff1f;4.浏览器重绘域重排的区别&#xff1f;5.CSS加载会阻塞DOM吗&#xff1f;6.JS会阻塞页面吗&#xff1f;7.说一说浏览器的缓存机…

基于ASP.NET的驾校管理系统设计与实现

摘 要 伴随国民经济的飞速发展和人民生活水平的不断提高&#xff0c;家用汽车在我国逐渐普及。面对不断增长的庞大的用户群&#xff0c;随之产生的驾驶培训行业&#xff0c;规模不断扩大。近年来&#xff0c;随着Internet的迅速发展以及网页制作技术的日臻完善&#xff0c;驾校…

win10查看并设置tomcat的jvm堆内存参数

win10查看并设置tomcat的jvm堆内存参数 查看 进入命令行 通过Winr命令输入cmd进入命令行页面 进入到jdk的bin目录 D: cd D:\Y4ECSRUN\WGQ4 Java jdk1.8.0 131\bin执行jps查看进程pid D:\Y4ECSRUN\WGQ4 Java jdk1.8.0 131\bin>jps 16528 Jps 6868 Bootstrap通过jmap查看…

【客户案例】脊叶架构(Spine-Leaf)的云化园区网络部署实践

前言 各行业数字化转型进程加快&#xff0c;作为基础设施的园区网络也面临着升级压力。为此&#xff0c;星融元通过将先进成熟的云网络建设理念引入园区场景&#xff0c;推出了“云化园区网络解决方案”&#xff0c;帮助客户网络实现架构级的深层优化。 云化园区网络解决方案介…

python 综合练习

条件&#xff1a;ML100k.data 注意&#xff1a;程序对列表进行修改&#xff0c;为避免列表索引出现问题&#xff0c;避免使用for i in range(len(data)),而使用for i in data可避免这一问题 import pickle data [] with open("ML100k.data", r) as file:for line …

从零开始的PICO教程(0) -- 教程大纲

从零开始的PICO教程&#xff08;0&#xff09; – 教程大纲 一、前言 1、写这个教程的原因 第一个原因是&#xff0c;相关教程较少。搜了搜B站和各个搜索引擎&#xff0c;感觉PICO开发这类的教程还比较少&#xff0c;遂记录一下我的学习的过程&#xff0c;为VR生态建设提供一…

左神算法之中级提升班(9)

【案例1】 【题目描述】 【思路解析】 因为它数字的范围只能为1 - n&#xff0c;然后数组范围0 - n-1&#xff0c;所以说如果没有缺失值的话&#xff0c;每个i位置应该放i 1&#xff0c;所以我们直接对每个数组完成这个操作&#xff0c;让每个i位置尽可能放i1&#xff0c;如…

C++(三)——运算符重载

运算符重载 重定义或重载大部分 C 内置的运算符就能使用自定义类型的运算符。重载的运算符是带有特殊名称的函数&#xff0c;函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样&#xff0c;重载运算符有一个返回类型和一个参数列表。不能为了重载而重…

GeoServer 安装及使用教程

GeoServer 安装及使用教程 一、前言二、安装1. 下载和安装Java2. 下载、安装、部署GeoServer3. 启动GeoServer4. 发布数据5. 结论 一、前言 GeoServer是一个开源的地理空间数据服务器&#xff0c;可以将地图数据发布为Web服务。在本篇教程中&#xff0c;我们将介绍如何安装GeoS…

B站:AB test [下]

Focus在&#xff1a;AB Test结束后&#xff0c;如何进行显著性检验&#xff1f;&#xff08;以判断改动是否有效果&#xff09; 引入&#xff1a;Z检验和T检验 而T检验适用于 n<30 的小样本 值得注意的是&#xff1a;统计上显著并不意味着现实中显著&#xff01; e.g. 加速…

Vue面试题以及解答(持续扩展中.....)

##Vue面试题## 1.组件中通讯方式有哪些 组件中通讯有$emit&#xff0c;props&#xff0c;vuex&#xff0c;provid和inject&#xff0c;$parent/$children&#xff0c;$refs&#xff0c;全局总线时间EvenBus&#xff0c;订阅与发布模式的subscrip/publish 2.Vue2和Vue3的区别…

尚硅谷大数据项目《在线教育之实时数仓》笔记001

视频地址&#xff1a;尚硅谷大数据项目《在线教育之实时数仓》_哔哩哔哩_bilibili 目录 P001 P002 P003 P004 P005 P001 以在线教育采集系统和离线数仓为前置基础&#xff0c;分为三个部分讲解&#xff1a;实时数仓架构介绍、数仓模型搭建、Suger可视化大屏展示。 P002 P0…

机票预定系统的软件工程分析报告

目 录 1 项目开发计划书……………………………………………………&#xff08;页码&#xff09; 2 软件需求规格说明书………………………………………………&#xff08;页码&#xff09; 3设计规格说明书……………………………………………………&#xff08;页码&…

uni-number-box的坑-无法实现数据双向绑定

业务场景&#xff1a;多规格商品----每一个规格定一个起购量&#xff0c;切换不同规格时动态改变起购数量。 代码&#xff1a; <uni-number-box class"step" ref"ChildComponents" :cid"productSku.productSkuUuid" :min"productSku.s…

STC8单片机PWM定时器+EC11编码器实现计数

STC8单片机PWM定时器+EC11编码器实现计数 📌相关篇《STC单片机+EC11编码器实现调节PWM输出占空比》📍《stc单片机外部中断+EC11编码器实现计数功能》🔖STC8系列支持此功能的型号: ✨从上面的相关篇中有通过通用定时器加外部中断以及常规方法实现驱动EC11编码器的方法。本…

Linux C++ 海康摄像头 Alarm Demo

项目结构 CMakeLists.txt cmake_minimum_required(VERSION 3.7)SET(CMAKE_BUILD_TYPE "Debug") SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")project(CapPicture…