【传知代码】智能推荐与隐私保护的融合(论文复现)

本文将深入探讨这样一种系统的设计理念、关键技术以及其在实际应用中的潜力和优势。通过探索如何在保证个性化推荐效果的同时,有效保护用户隐私,我们将揭示出一种新兴的技术趋势,为未来智能化应用的发展开辟新的可能性。

目录

概述

项目设计

核心代码

写在最后

概述

        本文的主要内容是介绍了一种名为LightFR的轻量级联邦推荐系统,该系统采用隐私保护的矩阵分解技术。文章首先回顾了矩阵分解、学习哈希和联邦推荐系统等相关领域的研究,然后详细介绍了LightFR的框架和算法,并从存储/通信效率、推荐效率和隐私保护等多个方面论证了其优越性。接下来,文章通过实验验证了LightFR的有效性和效率,并讨论了其对用户隐私的保护能力,主要创新点如下所示:

1)提出了一种轻量级、隐私保护的联邦推荐系统(FRS),名为LightFR,以解决现有工作中的效率和隐私问题。

2)通过学习哈希技术获得用户和项目的二进制表示,以有效解决联邦设置中的离散优化问题。

3)设计了一种高效的联邦离散算法,以在服务器和客户端之间嵌入用户偏好,同时减少资源消耗和保护隐私。

4)解释了为什么现有的方法没有考虑效率和隐私问题,以及它们在实际FRS中的主要挑战。

解决的主要问题:

现有问题

1)现有的联邦推荐系统(FRS)在资源效率和隐私保护方面存在挑战。

2)高成本的资源消耗和通信开销限制了现有方法在大规模推荐场景中的应用。

3)提高用户隐私保护的能力对于现实世界的FRS至关重要,但现有方法在这方面的考虑不足。

解决问题

1)开发一种轻量级且隐私保护的联邦推荐系统(FRS),以降低资源成本并提高隐私保护能力。

2)通过学习哈希技术获得用户和项目的二进制表示,从而有效解决效率和隐私问题。

3)设计一种在服务器和客户端之间高效的联邦离散算法,以嵌入用户偏好到离散汉明空间,同时降低服务器和客户端的资源利用,保护用户隐私。

论文提出了一种名为LightFR的轻量级联邦推荐方法,它通过矩阵分解和隐私保护的学习哈希技术实现轻量级、高效且安全的推荐。

项目设计

实验设计包括以下几个方面:

1)数据集:使用四个不同规模的公开数据集(MovieLens-1M、Filmtrust、Douban-Movie 和 Ciao)进行实验分析,以全面反映模型性能。

2)评估指标:使用两个常用的评估指标,即 Hit Ratio(HR)和 Normalized Discounted Cumulative Gain(NDCG),以评估模型性能和验证其有效性。

3)实验方法:对比中心化经典矩阵分解模型(如PMF、SVD++和DDL)和联邦矩阵分解基线(如FederatedMF)与提出的 LightFR 模型。分析不同超参数(如二进制编码长度 f、权衡参数 λ 和选定客户比例 p)对性能的影响。

本文的最核心创新点包括以下几点:

1)提出了一种轻量级的联邦推荐系统(LightFR),它通过学习哈希技术获得用户和项目的二进制表示,从而有效解决资源效率和隐私保护问题。

2)设计了一种高效的联邦离散算法,用于在服务器和客户端之间进行训练离散参数,实现了在保护隐私的方式下提高资源效率。

3)从理论角度证明了LightFR在存储/通信效率、推理效率和隐私保护方面的优越性。

4)通过大量实验证明,LightFR在推荐准确性、资源节约和数据隐私方面明显优于现有的联邦推荐方法。

核心代码

下面这个 Client 类体现了联邦学习在推荐系统中的应用,其中每个客户端独立地更新其模型(哈希表示),并可以在本地进行模型性能评估。整个过程旨在优化用户的哈希表示,使其能够更好地捕捉用户的偏好和行为模式,同时在联邦学习的框架下保持用户数据的隐私性:

import numpy as np
from Metrics import Metrics
class Client:def __init__(self, configs):self.bu = None #客户端的哈希表示self.D = None  # 与项目相关的全局参数self.data_u = None #特定客户端的用户数据self.data_bin_u = None #特定客户端的用户数据的二进制表示self.data_len_u = None #特定客户端的用户数据的长度self.configs = configsdef client_update(self, client, master_flag):'''client process, could be implemented in parallel:param master_flag::param bu::param D::param data_u::param data_bin_u::param l::return:'''while True:flag = 0for k in range(self.configs.code_len):dk = client.D[:, k]buk_hat = np.sum(( client.data_u - np.dot(client.D, client.bu.T)) * dk * client.data_bin_u) + 2 * self.configs.lambdaa * client.data_len_u * client.bu[k]buk_new = np.sign(self.K(buk_hat, client.bu[k]))if (client.bu[k] != buk_new):flag = 1client.bu[k] = buk_newif (flag == 0):breakmaster_flag = 1return client.bu, master_flagdef get_inter_params(self, i, k):di = self.D[i, :]grads = (self.data_u[i] - np.dot(self.bu, di.T)) * self.bu[k] * self.data_bin_u[i]grads_len = self.data_bin_u[i]return grads, grads_lendef K(self, x, y):return x if x != 0 else ydef calculate_loss(self):local_loss = np.sum((self.data_u - np.dot(self.D, self.bu)) ** 2 * self.data_bin_u)return local_lossdef evaluate_local(self, items, val_data):configs = {'top_k': 10, 'num_negative_test': 49, }metric = Metrics(configs)bus = self.budis = self.D[items]rating_pred = np.multiply(bus, dis)preds = np.sum(rating_pred, axis=1)val_data['pred'] = preds.tolist()hr = metric.get_hit_ratio(val_data)ndcg = metric.get_ndcg(val_data)return hr, ndcg

下面 Base 类提供了一个推荐系统基本框架,包括数据处理、模型初始化和评估。这个类能够处理用户和项目的交互数据,生成评分矩阵,并对推荐模型的性能进行评估。通过这种方式,它为构建更复杂的推荐系统模型提供了基础:

# -*- coding: utf-8 -*-
import numpy as np
import scipy.linalg as la
from collections import defaultdict
from math import log
import pandas as pd
import torch
from DataLoader import DataLoaderCenter
from Metrics import Metricsclass Base:def __init__(self):self.user = {}self.item = {}self.id2user = {}self.id2item = {}self.u_i_r = defaultdict(dict)self.i_u_r = defaultdict(dict)self.minVal = 0.5self.maxVal = 4self.dataset_name = 'filmtrust'self.federated_train_data_path = 'data/' + self.dataset_name + '/' + self.dataset_name + '_train.csv'self.federated_valid_data_path = 'data/' + self.dataset_name + '/' + self.dataset_name + '_val.csv'self.federated_test_data_path = 'data/' + self.dataset_name + '/' + self.dataset_name + '_test.csv'passdef init_model(self):self.generate_vocabulary()self.rating_matrix, self.rating_matrix_bin, self.globalmean = self.get_rating_matrix()self.B = np.sign(np.array(np.random.randn(len(self.user), self.configs.code_len) / (self.configs.code_len ** 0.5)))self.D = np.sign(np.array(np.random.randn(len(self.item), self.configs.code_len) / (self.configs.code_len ** 0.5)))self.loss, self.last_delta_loss = 0.0, 0.0def trainSet(self):with open(self.federated_train_data_path, 'r') as f:for index, line in enumerate(f):if index != 0:  # 去除headersu, i, r = line.strip('\r\n').split(',')r = 2 * self.configs.code_len * (float(r)) - self.configs.code_lenyield (int(u), int(i), float(r))def containUser(self, user_id):if user_id in self.user:return Trueelse:return Falsedef containItem(self, item_id):if item_id in self.item:return Trueelse:return Falsedef valid_test_Set(self, path):with open(path, 'r') as f:for index, line in enumerate(f):if index != 0:  # 去除headersu, i, r = line.strip('\r\n').split(',')# r = 2 * self.code_len * (float(int(r) - self.minVal) / (self.maxVal - self.minVal) + 0.01) - self.code_lenyield (int(u), int(i), float(r))def read_federated_valid_dataset(self, path):data_val = pd.read_csv(path)return data_valdef generate_vocabulary(self):for index, line in enumerate(self.trainSet()):user_id, item_id, rating = lineself.u_i_r[user_id][item_id] = ratingself.i_u_r[item_id][user_id] = ratingif user_id not in self.user:self.user[user_id] = len(self.user)self.id2user[self.user[user_id]] = user_idif item_id not in self.item:self.item[item_id] = len(self.item)self.id2item[self.item[item_id]] = item_idfor index, line in enumerate(self.valid_test_Set(self.federated_valid_data_path)):user_id, item_id, rating = lineself.u_i_r[user_id][item_id] = ratingself.i_u_r[item_id][user_id] = ratingif user_id not in self.user:self.user[user_id] = len(self.user)self.id2user[self.user[user_id]] = user_idif item_id not in self.item:self.item[item_id] = len(self.item)self.id2item[self.item[item_id]] = item_idfor index, line in enumerate(self.valid_test_Set(self.federated_test_data_path)):user_id, item_id, rating = lineself.u_i_r[user_id][item_id] = ratingself.i_u_r[item_id][user_id] = ratingif user_id not in self.user:self.user[user_id] = len(self.user)self.id2user[self.user[user_id]] = user_idif item_id not in self.item:self.item[item_id] = len(self.item)self.id2item[self.item[item_id]] = item_iddef get_rating_matrix(self):rating_matrix = np.zeros((len(self.user), len(self.item)))  # (943, 1596)globalmean = 0.0lens = 0for index, line in enumerate(self.trainSet()):lens += 1user_id, item_id, rating = lineglobalmean += ratingrating_matrix[self.user[user_id]][self.item[item_id]] = int(rating)rating_matrix_bin = (rating_matrix > 0).astype('int')globalmean = globalmean / (lens)return rating_matrix, rating_matrix_bin, globalmeandef K(self, x, y):return x if x != 0 else ydef valid_test_model(self, path):pre_true_dict = defaultdict(list)for index, line in enumerate(self.valid_test_Set(path)):user_id, item_id, rating = lineif (self.containUser(user_id) and self.containItem(item_id)):bu = self.B[self.user[user_id], :]di = self.D[self.item[item_id], :]pre = np.dot(bu, di)elif (self.containUser(user_id) and not self.containItem(item_id)):pre = sum(self.u_i_r[user_id].values()) / float(len(self.u_i_r[user_id]))elif (not self.containUser(user_id) and self.containItem(item_id)):pre = sum(self.i_u_r[item_id].values()) / float(len(self.i_u_r[item_id]))else:pre = self.globalmeanpre_true_dict[user_id].append([pre, rating])metrics = Metrics()ndcg_10 = metrics.calDCG_k(pre_true_dict, 10)return ndcg_10

写在最后

本文详细探讨了一款轻量级的隐私保护推荐系统的设计与实施。通过介绍其核心理念和关键技术,我们深入理解了如何在个性化推荐和用户隐私保护之间取得平衡。这种系统通过采用匿名化数据处理、去标识化技术和分布式计算等手段,有效降低了数据泄露的风险,同时保证了推荐的个性化和准确性。随着隐私问题日益成为社会关注的焦点,这样的技术创新不仅提升了用户的信任和满意度,也为未来智能化应用的发展指明了方向。未来,随着技术的进一步进化和隐私法规的完善,这种轻量级的隐私保护推荐系统有望在更广泛的应用场景中发挥重要作用,推动数字化社会的可持续发展。

详细复现过程的项目源码、数据和预训练好的模型可从地址获取。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM+小程序的就业管理系统(就业1)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 学生实习与就业管理系统的设计与实现管理员、辅导员管理、企业管理、工作管理人、用户管理5个角色。 1、管理员实现了基础数据管理、辅导员管理、企业管理、工作管理人管理、公告信息管理…

js 填充数组

let arr Array.from({ length: 10 }, (_, index) > index)console.log(arr) 人工智能学习网站 https://chat.xutongbao.top

如何用示波器检测次级点火系统(一)

写在最前面: 单看标题可能会让你觉得这篇文章的主题是关于检测线圈,火花塞和火花塞插头电线。但我们指的是分析燃烧室内电子的行为。目标是看燃料混合物,阀座,压缩,积碳和其它影响这种特性的症状。最终目的是要学会分…

FIR数字滤波器在MATLAB中的实现

摘要 数字滤波器是由数字乘法器、加法器和延时单元组成的一种装置。数字滤波器的功能是对输入离散信号的数字代码进行运算处理,以达到改变信号频谱的目的。近年来数字滤波在通信、图像编码、语言编码、雷达等许多领域中有着十分广泛的应用。 本文首先介绍了数字滤波…

为什么诺贝尔物理学奖颁给了 AI 大神

瑞典皇家科学院刚宣布,科学家约翰霍普菲尔德(John J. Hopfield) 和杰弗里辛顿 (Geoffrey E. Hinton) 荣膺 2024年诺贝尔物理学奖,以表彰他们通过人工神经网络 (ANN) 实现机器学习而作出的基础性发现和发明 (for foundational discoveries and…

程序员:代码世界的探险家与日常“救火队员”

在这个被数字与代码编织的时代,程序员,这一群看似平凡却又不凡的“数字工匠”,正用他们的智慧与汗水,构建着我们生活的每一个角落。值此1024程序员节之际,让我们以轻松幽默的方式,一同走进程序员的世界&…

8轴/4轴的EtherCAT轴模块EIO24088G-V2及EIO16084G的使用(一):TwinCAT总线配置与使用

上节课给大家介绍了 EIO24088-V2及EIO16084结合RTSys进行总线配置与使用,详情请点击→8轴/4轴的EtherCAT轴模块EIO24088-V2及EIO16084的使用(一):RTSys总线配置与使用。 今天正运动给大家分享一下EIO24088G-V2及EIO16084G如何用T…

DNS安全概述

一、DNS的解析过程 1.递归解析 递归解析是一种由DNS客户端(通常是用户的应用程序,如一个浏览器)向本地DNS解析器发出解析请求,然后本地DNS解析器负责查询最终结果并将结果返回给客户端,而中间的所有查询请求都由本地D…

Unity之如何在物体空间中制作马赛克

文章目录 前言屏幕空间马赛克着色器对象空间中的马赛克着色器最后前言 GrabPass 允许您创建应用马赛克叠加的着色器。如果你想在屏幕空间中应用马赛克,你可以通过使用片段着色器对其进行离散化来实现,但我在尝试将其应用到对象空间时遇到了问题,所以这是一个记录。 ▼ 原图…

proteus中没有STM32F103C8(已解决)

想在proteus找一个和开发板相同的芯片型号STM32F103C8T6,亲测proteus的7.8、8.6、8.9版本都没有STM32F103C8,然后在proteus8.15中找到了,M4内核的芯片也有。 M3内核: M4内核:

新脉集团携手中宏大数据 共推县域乡村振兴与数据资产化

2024年10月23日,数字生态赋能平台新脉集团与中宏大数据产业有限责任公司正式宣布达成战略合作。新脉集团创始人兼CEO李晶、新脉集团联合创始人兼CSO梁钟、新脉集团首席城市战略顾问邓详达、新脉中医健康教育学院院长王庆辉以及中宏大数据产业有限责任公司总裁张春宝…

053_python基于深度学习的短视频内容理解与推荐系统

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…

ZYNQ PS_GPIO中断

REVIEW zynq PS端 GPIO_zynq modem signal-CSDN博客 C基础与SDK调试方法_csdk-CSDN博客 AXI_GPIO_axigpio-CSDN博客 对于GPIO,前面只用了简单读写,今天搞一下中断 1. 今日摸鱼任务 了解中断原理,实现PS_GPIO中断。 MIIO: #define PS_KEY 47#…

零售行业的数字化营销转型之路

一方面,市场竞争激烈,电商平台、新兴品牌和跨界对手带来巨大压力。另一方面,消费者需求变化迅速,更加追求个性化、多元化和便捷化的购物体验,同时传统零售企业还面临着高成本压力,如租金、人力和库存等。 然…

Chainlit集成LlamaIndex和Chromadb实现RAG增强生成对话AI应用

前言 本文主要讲解如何使用LlamaIndex和Chromadb向量数据库实现RAG应用,并使用Chainlit快速搭建一个前端对话网页,实现RAG聊天问答增强的应用。文章中还讲解了LlamaIndex 的CallbackManager回调,实现案例是使用TokenCountingHandler&#xf…

Pollard‘s p-1算法

概述 光滑数 (Smooth number):指可以分解为多个小素数乘积的正整数 当p是N 的因数,并且p−1是光滑数,可以考虑使用Pollards p-1算法来分解N 当p是N的因数,并且p1是光滑数,可以考虑使用Williamss p1算法来分解N 这里…

程序员节-回顾篇

回顾: 时间如白驹过隙,转眼间,我们又走过了一个充满挑战与机遇的年份。回顾过去的一年,心中充满了感慨与收获。 一、个人成长 这一年里,我在各个方面都有了显著的成长。在工作上,我通过不断学习和实践&a…

【小洛的VLOG】Web 服务器高并发压力测试(Reactor模型测试)

目录 引言 工具介绍 环境介绍 测试结果 个人主页:东洛的克莱斯韦克-CSDN博客 引言 大部分的网络通信都是支持TCP/IP协议栈,为了保证通信的可靠性,客户端和服务端之间需要建立链接。服务端能并发处理多少个链接,平均每秒钟能处理…

国产蓝牙耳机哪个品牌值得买?百元国产蓝牙耳机品牌排行榜

一款优质的蓝牙耳机总能为我们带来更加便捷、舒适的听觉体验,而在众多蓝牙耳机品牌中,国产蓝牙耳机凭借其高性价比、丰富的功能和独特的设计,逐渐赢得了消费者的青睐,那么国产蓝牙耳机哪个品牌值得买?作为一个资深的蓝…

一、Linux 目录文件

一、目录结构 |-/ # 根节(cd /) |-/bin # 系统命令 |-/boot # 启动目录 |-/dev # 设备文件保存目录 |-/etc # 系统的所有配置文件|-profile # 环境变量配置文件(修改后需source /etc/profile使配置文件立即生效) |-/home # 普通用…