【传知代码】基于图的去中心化社会推荐过滤器(论文复现)

news2024/11/15 1:55:19

在当今信息爆炸的时代,社交媒体和数字平台已经成为我们获取信息、交流观点以及发现新内容的主要途径。然而,随着内容数量的剧增,用户面临着信息过载和质量参差不齐的挑战。为了解决这一问题,基于图的去中心化社会推荐过滤器应运而生。

本文所涉及所有资源均在传知代码平台可获取

目录

概述

算法流程

核心代码

写在最后


概述

        由于这些社会关系可以轻松地用图结构数据来表示,因此图神经网络在这一领域具有很大的发展潜力。然而,现有的基于图的算法在处理数据时往往忽略了用户或事件的偏好偏移量。作者给出的一个示例说明了这种偏移量的重要性:挑剔的用户给出的低评分并不一定意味着他们对产品的态度是消极的,因为这些用户通常会给出低评分,这可能会导致图结构数据分析产生误差。现有的方法通常将这种偏差作为标量融入模型训练中,但作者认为这种做法不足以捕捉所有相关信息。此外,作者指出,用户之间的社会联系也应被考虑在内,因为具有相似偏好的用户往往会对彼此产生更大的影响。基于此,作者提出了一种新的算法来解决这些问题。

        作者将评价偏移量处理为向量,并将其融入到用户和事件的表征学习中。具体做法是计算用户与其他用户的评价差异向量,从而获得每个用户的评价偏移。具体做法是,他们对原始图进行去中心化处理,然后从中学习到用户和事件的表征。去中心化的图是基于原始图中的统计信息生成的。接着,作者提出了一种用户-用户之间社会关系的建模方式,并将其融入到预测规则中,以提高推荐表现。然后,基于去中心化图,他们提出了一种基于图神经网络(GNN)的社会推荐协同过滤模型。最后,作者在两个数据集上验证了所提出算法的有效性,证明了其在处理用户偏好偏移量和社会关系建模方面的优势。原论文中采用了大量的数学公式来表示算法过程,这里笔者认为实际上读起来有点费力,所以本文主要从感性的角度来对这篇论文进行讲解,尽量少用公式而是用文字描述来给大家建立一个感性的理解。

原论文链接:https://ieeexplore.ieee.org/abstract/document/9721542
模版代码链接:https://github.com/MEICRS/GDSRec_rank

算法流程

        下面我们来具体介绍一下算法的原理。首先,我们的数据集中包含用户和事件(item)两类对象,用户对item会有一个评分(rating)。具体任务是预测数据集R中未观察到的评分,然后返回用于推荐的排名列表。

原文采用的建图方式是将用户和事件作为节点,用户-事件之间的连线权重为关系系数Tij,用于衡量两个用户的相似度。 

关系系数的计算方式可以看作是设定一个阈值,当两个用户对同一个事件的评分差距在阈值之内时,就将相似度加一,累加起来就是两个用户的相似度,这里称为关系系数。而用户-事件连线的权重为用户对事件的评分。然而,作者指出,直接使用这种原始图会带来一些不足,也就是无法准确反映真正的用户偏好。这是因为用户对事件的评分可能受到不同用户的打分标准的影响,从而导致误解用户的真实偏好。因此,作者对图结构进行了去中心化处理,以更好地捕捉用户的真实偏好。

去中心化图有三种不同的边:用户-事件、事件-用户、用户-用户。对于每个用户-事件交互的边,用原始权重减去所有权重的平均值得到新的权重,而用户-用户连线的权重保持不变。通过这种方式,作者将统计信息融入到图中。接下来,作者针对这种去中心化图进行了对用户、事件、社会联系三种方向的建模,从而计算出三种潜在因素偏移量。依据这些偏移量,可以计算出最终用户ui和事件vj的最终偏好评分,即: 

然后我们具体介绍一下作者提出的三种建模方式。我们以用户建模(user modeling)为例,期望得到的输出是潜在因素偏移量hui。整个流程可以用上面的公式表示,我们可以逐步拆分这个过程。

然后我们具体介绍一下作者提出的三种建模方式。我们以用户建模(user modeling)为例,期望得到的输出是潜在因素偏移量hui。整个流程可以用上面的公式表示,我们可以逐步拆分这个过程。

首先,需要提到的是,在这个过程中使用的用户-事件交互权重都是进行取整后的。原文指出,使用小数进行embedding不太方便,但同时也提到一些量化方法可以解决这个问题,他们将这部分留作未来工作。前面提到,这篇文章的一大贡献是将评价偏移量处理为向量。

具体做法是将事件vlvl​与用户-事件交互的权重进行embedding后的表征进行拼接,然后通过一个多层感知机进行处理,从而融入到学习过程中。q,sq,s分别是事件uu和社会关联rr的表征,LULU​是多层感知机,这种方法可以将该向量融入用户表征的学习过程中。

同时,作者指出,一个用户和相关联事件之间的每个关联对用户潜在因素的影响贡献是不同的。因此,他们采用了注意力机制来捕捉用户偏好中的差异。公式8中xx前面乘的系数实际上是注意力权重。需要注意的是,在输入注意力网络时,他们将前面的评价偏移向量与用户的embedding向量进行了拼接,然后通过一个两层神经网络进行处理。通过这一流程,就可以得到用户的潜在因素偏移量hui。

事件建模(item modeling)和社会关系建模(social modeling)的处理方式与用户建模类似。三种建模处理后,我们可以得到三种潜在因素偏移量。基于此,偏好评分可以通过三层神经网络获得,用公式9,10,11表示。这个偏好评分可以理解为包括用户自己的意见和对其社会关联用户评级的参考。对于用户ui的社会关联用户,我们可以用相同的方式得到他们的偏好评分,从而得到方程f的返回值,计算方式如公式12。

最终,我们回到前面公式4就可以计算出用户ui和事件vj之间的最终评分。以这种方式就可以实现对用户更全面偏好信息的捕获,以及考虑到有着更强社会关联的用户对用户ui的影响。

核心代码

main.py文件在这里仍然是起到一个调用模型和所有函数进行数据输入、处理、训练、结果输出的功能,值得注意的是这里原文作者使用了config参数定义的方式,让整个工程看起来更加简洁、标准:

import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
import pickle
import torch
from torch.utils.data import DataLoader
from utils import collate_fn
from model.GDSRec_model import GDSRec_Engine


config = {
    'model': 'GDSRec', 
    'dataset': 'Ciao',  # Ciao/Epinions
    'optimizer': 'adam',
    'l2_regularization': 0.01,
    'embed_size': 64,
    'batch_size': 128,
    'layers': [256,128,128,64,64],
    'epoch': 20,
    'lr': 0.0005,  # 0.01, 0.001, 0.0001
    'lr_dc': 0.1,  # learning rate decay
    'lr_dc_step': 100,  # the number steps for decay
    'test':False,
    'model_dir': 'checkpoints/{}_{}_best_checkpoint.model'
}
print(config)
here = os.path.dirname(os.path.abspath(__file__))
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(device)
config['device'] = device
workdir = 'C:/Users/meicr/Desktop/GDSRec_rank/data/'
with open(workdir + config['dataset'] + '/' + config['model'] + '_dataset.pkl', 'rb') as f:
    train_dataset, evaluate_dataset, test_dataset, user_count, item_count = pickle.loads(f.read())
config['num_users'] = user_count
config['num_items'] = item_count
config['num_rates'] = 5

if config['test'] is False:
    engine = GDSRec_Engine(config)
    train_loader = DataLoader(train_dataset, batch_size=config['batch_size'], shuffle=True, collate_fn=collate_fn)
    evaluate_loader = DataLoader(evaluate_dataset, batch_size=config['batch_size'], shuffle=False,
                                    collate_fn=collate_fn)
    index_sum = []
    for epoch in range(config['epoch']):
        print('Epoch {} starts !'.format(epoch))
        engine.train_an_epoch(train_loader, epoch)
        recall, ndcg = engine.evaluate(evaluate_loader, epoch)
        if epoch == 0:
            pre_sum = recall + ndcg
            index_sum.append(0)
        else:
            if recall + ndcg < pre_sum:
                index_sum.append(1)
            else:
                pre_sum = recall + ndcg
                index_sum.append(0)
        if sum(index_sum[-10:]) == 10:
            break
        if epoch == 0:
            best_sum = recall + ndcg
            engine.save()
        elif recall + ndcg > best_sum:
            best_sum = recall + ndcg
            engine.save()
else:
    engine = GDSRec_Engine(config)
    print('Load checkpoint and testing...')
    engine.resume()
    test_loader = DataLoader(test_dataset, batch_size=config['batch_size'], shuffle=True, collate_fn=collate_fn)
    recall, ndcg = engine.evaluate(test_loader, epoch_id=0)

这里preprocess.py文件的作用是对我们输入的数据进行了处理和分析得到模型可以处理的对象,主要包括格式转换、用户相似度计算之类的功能 

"""
@author: Jiajia Chan
@date: 20 June, 2020
"""
import random
import argparse
import pickle
import pandas as pd
from scipy.io import loadmat
from rating_data import SingleGenerator
from trust_data import SocialGenerator

random.seed(1234)


if __name__ == '__main__':
    parser = argparse.ArgumentParser() 
    parser.add_argument('--dataset', default='Ciao', help='dataset name: Ciao/Epinions')
    parser.add_argument('--test_prop', default=0.2, help='the proportion of data used for test')
    args = parser.parse_args() 
    workdir = 'data/'

    click_f = loadmat(workdir + args.dataset + '/rating.mat')['rating']
    trust_f = loadmat(workdir + args.dataset + '/trustnetwork.mat')['trustnetwork']
    click_dt = pd.DataFrame(click_f)
    trust_dt = pd.DataFrame(trust_f, columns=['userID', 'freID'])
    click_dt = click_dt[[0, 1, 3]]
    click_dt.dropna(inplace=True)
    click_dt.drop_duplicates(inplace=True)
    click_dt.columns = ['userID', 'itemID', 'rating']
    trust_dt.dropna(inplace=True)
    trust_dt.drop_duplicates(inplace=True)

    single_generator = SingleGenerator(ratings=click_dt, prob=args.test_prop)
    social_generator = SocialGenerator(singlegenerator=single_generator, trust=trust_dt)
    GDSRec_dataset = social_generator.instance_GDSRec_dataset()
    general_dataset = single_generator.instance_general_dataset()
    with open(workdir + args.dataset +'/' + 'GDSRec' + '_dataset.pkl', 'wb') as f:
        str1 = pickle.dumps(GDSRec_dataset)
        f.write(str1)
        f.close()

我们在github官方链接上只能找到一个数据集Ciao(原论文是在Ciao和Epinions上都进行了实验),我们需要将数据集整理成上述格式,这里可以打开看一下。整理的格式如右图所示,第一列是学生id, 第二列是问题id,第三列是无关变量原文代码中并没有用到,第四列是rating,trustnetwork.mat文件中保存的是学生与学生之间的关系网络。因此我们在进行本地私有数据集训练时也需要将数据处理成对应的格式 

该篇论文作者在github上公布了源代码,但笔者下载下来实际运行了之后发现完全按照模版代码运行仍然会出现一些问题。研究之后发现可能是原作者在编写代码后改动了数据集目录格式,导致一些设定的环境路径参数错误。如果我们想要跑通代码或者在本地运行自己的数据集进行实验,还需要对相应的参数进行修改,修改后的代码我已经放在本文附件中了,并且在附件的压缩包内新增了一个Readme文件来提示大家如何修改数据集路径为自己的私有数据集 

写在最后

本文深入探讨了基于图的去中心化社会推荐过滤器作为应对信息过载和数据操控挑战的创新解决方案。通过分析其核心原理和优势,我们理解了这一技术如何利用复杂的图数据结构,实现更精准、透明的个性化推荐服务。

首先,我们探讨了基于图的推荐系统如何有效地捕捉用户、内容和社交关系之间的多维度交互,从而提升推荐的准确性和用户满意度。其次,本文详细讨论了去中心化设计的重要性,如何增强数据隐私保护、抵御信息操控,以及提升平台的信任度和社会效益。

在实际应用方面,我们分析了基于图的推荐过滤器在不同场景中的成功案例,展示了其在提升信息质量、增强社交互动和保障用户权益方面的显著优势。此外,本文还探讨了未来发展的潜力,包括结合机器学习和人工智能技术进一步优化推荐算法,以及推动去中心化社交平台的普及和应用。

综上所述,基于图的去中心化社会推荐过滤器不仅是推荐系统领域的重要创新,更是推动数字社会发展、保护用户权益的关键技术之一。随着技术的不断进步和应用的拓展,相信这一技术将为构建开放、透明的数字社会平台带来更广阔的前景和机遇。

详细复现过程的项目源码、数据和预训练好的模型可从该文章下方附件获取。

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

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

相关文章

AIR 调用 Python 脚本的解决方案

1. 问题背景 在 AIR 1.5 中&#xff0c;无法直接调用系统命令或运行可执行文件&#xff08;如 Python 解释器&#xff09;。 2. 解决方案 由于安全限制&#xff0c;AIR 应用程序无法直接调用系统命令或运行可执行文件。因此&#xff0c;以下解决方案仅适用于能够共享详细信息…

【传知代码】LAD-GNN标签注意蒸馏(论文复现)

近年来&#xff0c;随着图神经网络&#xff08;GNN&#xff09;在各种复杂网络数据中的广泛应用&#xff0c;如何提升其在大规模图上的效率和性能成为了研究的热点之一。在这个背景下&#xff0c;标签注意蒸馏&#xff08;Label Attention Distillation&#xff0c;简称LAD&…

分包—小程序太大,上传不上去,采用分包处理方式

在 app.json 中配置 subpackages 字段来定义分包。创建分包目录如左边红框。例如&#xff1a;

[Meachines] [Easy] Mirai Raspberry树莓派默认用户登录+USB挂载文件读取

信息收集 IP AddressOpening Ports10.10.10.48TCP:22,53,80,1276,32400,32469 $ nmap -p- 10.10.10.48 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.7p1 Debian 5deb8u3 (protocol 2.0) | ssh-hostkey: | 1024 aa:ef:5c:…

vue-cli3脚手架详细讲解 基于webpack

1.安装vue3:新建一个文件夹&#xff0c;进入该文件夹下&#xff0c;执行 vue create ( 项目名称) , 如下图&#xff1a; vuecli3为项目名称&#xff0c;进入下一步&#xff0c; 我们选择第3个&#xff0c;进入下一步 这里要我们选择一个配置&#xff0c;按住上下键进行调转&a…

240802-Python代码混淆及加密的一些工具

1. 有哪些开源免费的工具&#xff0c;可以对Python代码加密 加密Python代码可以通过多种方法实现&#xff0c;尽管这些方法主要是为了保护代码不被轻易阅读或修改&#xff0c;但无法完全防止逆向工程。以下是一些开源免费的工具和方法&#xff0c;可以用于加密Python代码&…

聊聊ChatGLM-6B的源码分析

基于ChatGLM-6B第一版&#xff0c;要注意还有ChatGLM2-6B以及ChatGLM3-6B PrefixEncoder 作用&#xff1a;在微调时&#xff08;以P-Tuning V2为例&#xff09;&#xff0c;方法训练时冻结模型的全部参数&#xff0c;只激活PrefixEncoder的参数。 其源码如下&#xff0c;整体来…

Python数值计算(16)——Hermite插值

1. 概述 不管是前面介绍到拉格朗日插值还是牛顿插值&#xff0c;拟合的函数比线性插值更加“优秀”&#xff0c;即它们都是连续可导的&#xff0c;但是&#xff0c;有时拟合还有这样的要求&#xff0c;就是除了在给定点处的函数值要相等外&#xff0c;还要求在这些指定点处的导…

fastjson-小于1.2.47绕过

参考视频&#xff1a;fastjson反序列化漏洞3-<1.2.47绕过_哔哩哔哩_bilibili 分析版本 fastjson1.2.24 JDK 8u141 分析流程 分析fastjson1.2.25更新的源码&#xff0c;用JsonBcel链跟进 先看修改的地方 fastjson1.2.24 if (key JSON.DEFAULT_TYPE_KEY && !…

鸿蒙(API 12 Beta2版)NDK开发【JSVM-API简介】

JSVM-API简介 场景介绍 HarmonyOS JSVM-API是基于标准JS引擎提供的一套稳定的ABI&#xff0c;为开发者提供了较为完整的JS引擎能力&#xff0c;包括创建和销毁引擎&#xff0c;执行JS代码&#xff0c;JS/C交互等关键能力。 通过JSVM-API&#xff0c;开发者可以在应用运行期间…

大语言模型时代的挑战与机遇:青年发展、教育变革与就业前景

摘要: 当前,大语言模型技术的崛起正在对多个领域带来深远影响,其中教育与就业便是重点受影响领域之一。本文旨在深入探究大语言模型对青年群体发展、教育体系变革以及就业前景的影响,并提出相应的应对措施与建议。 通过运用社会认知理论、建构主义教育理论、技能匹配理论等学…

基于单片机的多功能视力保护器设计

摘要&#xff1a;眼睛是人心灵的窗户&#xff0c;现在信息网络技术的发展&#xff0c;手机成了人们的必备之物&#xff0c;青少年不良的习惯导致现在视力问题严重。越来越多的视力保护产品得到了研发&#xff0c;其中基于单片机的新型视力保护装置&#xff0c;为视力保护产生了…

作用域和链接属性

是什么决定了两个同名变量是否会发生冲突&#xff1f; 是作用域。 goto 语句的作用域是&#xff1f;答&#xff1a;goto 语句受函数作用域&#xff08;function scope&#xff09;所限制&#xff0c;因此 goto 语句仅能在函数体内部跳转&#xff0c;不能跨函数跳跃。 全局变…

【雅思报考流程】教你报名雅思考试 | 保姆级雅思报考指导教程!

官网 1.注册 首先进行注册 剩下正常填写即可&#xff0c;注册完毕会给邮箱发送确认邮件需要确认一下以及用户号这个很重要需要妥善保存 2.充值 会看到不同的类别&#xff0c;其中雅思考试费第一个是标准的雅思考试&#xff0c;第二个是英国签证的UKVI要看去英国上不上语言…

精通推荐算法16:特征交叉之PNN

1 背景 Deep Crossing通过“Embedding MLP”的范式&#xff0c;奠定了深度学习在推荐算法中的重要地位&#xff0c;引领了一股学术界和工业界不断应用和优化深度学习推荐算法的风潮。上海交通大学提出了PNN模型&#xff0c;通过在Embedding层之后引入一个Product层&#xff0…

实战大数据:分布式大数据分析处理系统的开发与应用

&#x1f482; 个人网站:【 摸鱼游戏】【网址导航】【神级代码资源网站】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

对 Redis 的认识还停留在 4.x 版本?7.0 全新特性很惊艳!

我是码哥&#xff0c;可以叫我靓仔。我人生中的第一本书《Redis 高手心法》出版了&#xff01; 作为当今广受欢迎的内存数据库&#xff0c;Redis 以其卓越的性能和广泛的应用场景著称。 掌握 Redis 技术几乎成为每位开发人员、测试人员和运维人员的看家本领&#xff01; 大约…

查物流信息用什么软件

在电子商务日益繁荣的今天&#xff0c;快递物流信息的查询成为了我们日常生活中不可或缺的一部分。无论是网购达人还是商家&#xff0c;都需要随时掌握货物的物流动态。然而&#xff0c;如何快速、准确地查询物流信息却是一个令人头疼的问题。今天&#xff0c;我将为大家介绍一…

使用ASH诊断Oracle解析故障

英文原文在&#xff1a;Diagnosing Parsing Issue with ASH 解析&#xff0c;尤其是硬解析&#xff0c;是非生产性操作&#xff0c;会消耗大量系统资源&#xff0c;导致库缓存争用。ASH&#xff08;Active Session History&#xff09;可以通过其采样机制来诊断和分析过度的解…