当前位置: 首页 > article >正文

二元随机响应(Binary Randomized Response, RR)的翻转概率

随机响应(Randomized Response)机制


✅ 回答核心:

p = 1 1 + e ε 才是「翻转概率」 \boxed{p = \frac{1}{1 + e^{\varepsilon}}} \quad \text{才是「翻转概率」} p=1+eε1才是「翻转概率」

而:
q = e ε 1 + e ε 是「保留真实值」的概率 \boxed{q = \frac{e^{\varepsilon}}{1 + e^{\varepsilon}}} \quad \text{是「保留真实值」的概率} q=1+eεeε是「保留真实值」的概率


✅ 为什么 p 才是翻转概率?

随机响应机制:用于二元隐私(0 或 1)

给定真实值 x ∈ {0,1},你不直接返回 x,而是使用以下方式:

  • 以概率 q = e ε 1 + e ε q = \frac{e^\varepsilon}{1 + e^\varepsilon} q=1+eεeε 保留 x
  • 以概率 p = 1 1 + e ε p = \frac{1}{1 + e^\varepsilon} p=1+eε1 返回 1 - x(翻转)

公式来源(源自 Local Differential Privacy 的 Binary Randomized Response):

隐私预算 ε输出 1 的概率(如果 x=1)输出 1 的概率(如果 x=0)
ε = ∞1(永远保留)0(永远不翻转)
ε = 00.5(完全随机)0.5(完全随机)

这满足 ε-LDP 要求的最小扰动机制。


✅ 举个例子:

假设真实值为 1,ε = 1:

  • q = e 1 1 + e 1 ≈ 0.731 q = \frac{e^1}{1 + e^1} ≈ 0.731 q=1+e1e10.731 → 有 73.1% 概率返回 1(保留真实值)
  • p = 1 1 + e 1 ≈ 0.269 p = \frac{1}{1 + e^1} ≈ 0.269 p=1+e110.269 → 有 26.9% 概率返回 0(翻转)

所以 p 是翻转概率,你撒谎的概率!


✅ 总结对比:

名称公式含义
翻转概率 1 1 + e ε \boxed{\frac{1}{1 + e^\varepsilon}} 1+eε1"撒谎"的概率
保留真实值的概率 e ε 1 + e ε \frac{e^\varepsilon}{1 + e^\varepsilon} 1+eεeε说实话的概率
总和两者之和为 1分别处理真实值/扰动

✅ 一句话总结:

p = 1 / (1 + exp(ε)) 是你翻转真实值(加噪声)的概率 —— 所以它才叫 翻转概率


🧠 代码1:

def matrix_randomized_response(x, eps):x = x.to(torch.bool)em = math.exp(eps)flip_prob = 1.0 / (em + 1)  # 翻转概率p = torch.full_like(x, 1 - flip_prob, dtype=torch.float32)  # 保留概率keep_mask = torch.bernoulli(p).to(torch.bool)x_noised = (~(x ^ keep_mask)).to(torch.float)return x_noised

我们来逐行详细解读这段 matrix_randomized_response 函数,重点也会解释提到的核心扰动表达式:


✅ 目标:

这个函数实现 Binary Randomized Response (BRR):对布尔矩阵 x 进行局部差分隐私(LDP)扰动,即:

对于每个元素:
以概率 e ε 1 + e ε \frac{e^\varepsilon}{1 + e^\varepsilon} 1+eεeε 保留原值,
以概率 1 1 + e ε \frac{1}{1 + e^\varepsilon} 1+eε1 翻转(扰动)它


🔍 逐行解释:


x = x.to(torch.bool)
  • 把输入 x 强制转为布尔型(0/1)
  • 假设原始 x 是邻接矩阵或 one-hot 标签

em = math.exp(eps)
flip_prob = 1.0 / (em + 1)
  • 计算 e ε e^\varepsilon eε,这是 LDP 中用于设定隐私保护强度的值
  • 计算翻转概率:
    flip_prob = 1 1 + e ε \text{flip\_prob} = \frac{1}{1 + e^\varepsilon} flip_prob=1+eε1

p = torch.full_like(x, 1 - flip_prob, dtype=torch.float32)
  • 构造与 x 同形状的张量,每个值为「保留原值的概率」
    1 − flip_prob = e ε 1 + e ε 1 - \text{flip\_prob} = \frac{e^\varepsilon}{1 + e^\varepsilon} 1flip_prob=1+eεeε

keep_mask = torch.bernoulli(p).to(torch.bool)
  • p 进行伯努利采样,得到一个布尔掩码:

    • True 表示保留原值
    • False 表示需要翻转

✅ 🔍 解读核心扰动表达式:

x_noised = (~(x ^ keep_mask)).to(torch.float)

这行做的是:

✴️ 布尔异或(XOR):

  • x ^ keep_mask

    • keep_mask=True(保留):x ^ True = not x
    • keep_mask=False(翻转):x ^ False = x
      所以直接 x ^ keep_mask反了

✴️ 再加一个 ~(取反)修正逻辑:

  • ~(x ^ keep_mask) 恰好实现:
xkeep_maskx ^ keep_mask~(x ^ keep_mask)结果解释
0True10保留 0 ✅
1True01保留 1 ✅
0False01翻转成 1 ✅
1False10翻转成 0 ✅

.to(torch.float)

  • 最后把布尔张量转为浮点数张量(0.0 / 1.0),用于模型继续计算

✅ 最终效果:

这段代码实现的是对二值矩阵 x 中的每个值:

  • 以概率 e ε 1 + e ε \frac{e^\varepsilon}{1 + e^\varepsilon} 1+eεeε 保留
  • 以概率 1 1 + e ε \frac{1}{1 + e^\varepsilon} 1+eε1 翻转(扰动)

这是 Binary Randomized Response 的标准实现,适用于差分隐私保护场景。


🧠 代码2:

def rr_adj():p = 1.0/(1.0+math.exp(self.eps_a))res = ((adj + torch.bernoulli(torch.full((n, n), p)).to(device)) % 2).float()res.fill_diagonal_(0)return res

🔧 函数定义:

① 计算扰动概率:

p = 1.0 / (1.0 + math.exp(self.eps_a))
  • self.eps_a 是图结构扰动的隐私预算(epsilon)
  • 公式来自 Binary Randomized Response
  • p = 1 1 + e ε p = \frac{1}{1 + e^{\varepsilon}} p=1+eε1 是“翻转边”的概率(即扰动概率)

② 生成随机掩码并执行扰动:

res = ((adj + torch.bernoulli(torch.full((n, n), p)).to(device)) % 2).float()
  • torch.full((n, n), p):创建一个全为 p 的二维张量,大小为 n × n n \times n n×n,和邻接矩阵 adj 一样大

  • torch.bernoulli(...):对每个元素独立进行伯努利采样(值为 1 的概率为 p,表示翻转)

  • adj + ...:相当于原始邻接矩阵加上“翻转掩码”

  • % 2:实现XOR(异或),即:

    • 0 + 1 = 1 (加边)
    • 1 + 1 = 0 (删边)
    • 0 + 0 = 0 (保持原样)
  • .float():把最终的布尔(0/1)结果转成浮点张量

🔁 最终效果:以概率 p 对每个边进行是否存在的翻转


③ 去除对角线(防止自环):

res.fill_diagonal_(0)
  • 强制将所有的对角线元素(即 self-loop)设为 0,防止扰动产生自环

✅ 总结一下逻辑:

这个函数 rr_adj() 实现的是:

对输入图的邻接矩阵 adj

  • 对每一条边(包括 0)以概率 1 1 + e ε \frac{1}{1 + e^{\varepsilon}} 1+eε1 进行翻转(1→0,0→1)
  • 对角线(self-loops)始终设为 0

📌 关键点理解:

步骤解释
torch.bernoulli(p)决定是否翻转
% 2实现 XOR 翻转
fill_diagonal_(0)保证图中没有自环
eps_a 越大翻转概率越小,扰动越少,隐私越弱
eps_a = 0翻转概率 = 0.5,最随机,最大隐私保护

在这个上下文中:% 2 确实等价于 XOR(异或)操作,当我们处理的是布尔值或 0/1 值的张量时。


✅ 举个例子来说明:

设有两个值 ab,都在 {0, 1} 之间(也就是二值):

aba + b(a + b) % 2a ^ b (XOR)
00000
01111
10111
11200

✅ 在 PyTorch 中:

  • a ^ b 是布尔类型的异或(必须是 bool)
  • (a + b) % 2 是数值类型的异或等价操作(适用于 int/float 形式)

✅ 总结:

表达式类型要求等价含义
a ^ b布尔张量异或(推荐用于 bool)
(a + b) % 2数值张量(0/1)异或(等价,更通用)

✅ 一句话评价:

  • matrix_randomized_response() 更通用、更清晰、语义更明确。
  • ⚠️ rr_adj() 更简洁,但逻辑上容易误解,并且不适合复用到非邻接矩阵。

🔍 逐点比较:

rr_adj()matrix_randomized_response()
✅ 功能完整是(扰动 + 去自环)是(扰动,适合任意矩阵)
📦 可复用性差,只能用于邻接矩阵强,可用于标签、特征、邻接等
💬 表达语义模糊,% 2 实现 XOR 不直观清晰,显示 ^ 表达异或逻辑
📐 翻转概率显式是,直接使用 1 1 + e ε \frac{1}{1+e^\varepsilon} 1+eε1是,明确区分“翻转/保留”概率
🚫 特殊处理对角线有(显式 fill_diagonal_)无(需调用者自行处理)
⚙️ 类型控制隐式处理,全部 float明确布尔处理,更安全

相关文章:

二元随机响应(Binary Randomized Response, RR)的翻转概率

随机响应(Randomized Response)机制 ✅ 回答核心: p 1 1 e ε 才是「翻转概率」 \boxed{p \frac{1}{1 e^{\varepsilon}}} \quad \text{才是「翻转概率」} p1eε1​​才是「翻转概率」 而: q e ε 1 e ε 是「保留真实值」…...

hive两个表不同数据类型字段关联引发的数据倾斜

不同数据类型引发的Hive数据倾斜解决方案 #### 一、‌原因分析‌ 当两个表的关联字段存在数据类型不一致时(如int vs string、bigint vs decimal),Hive会触发隐式类型转换引发以下问题: ‌Key值的精度损失‌:若关联字…...

利用SSRF击穿内网!kali靶机实验

目录 1. 靶场拓扑图 2. 判断SSRF的存在 3. SSRF获取本地信息 3.1. SSRF常用协议 3.2. 使用file协议 4. 172.150.23.1/24探测端口 5. 172.150.23.22 - 代码注入 6. 172.150.23.23 SQL注入 7. 172.150.23.24 命令执行 7.1. 实验步骤 8. 172.150.23.27:6379 Redis未授权…...

DVWA在线靶场-xss部分

目录 1. xxs(dom) 1.1 low 1.2 medium 1.3 high 1.4 impossible 2. xss(reflected) 反射型 2.1 low 2.2 medium 2.3 high 2.4 impossible 3. xss(stored)存储型 --留言板 3.1 low 3.2 medium 3.3 high 3.…...

Go 语言 slice(切片) 的使用

序言 在许多开发语言中,动态数组是必不可少的一个组成部分。在实际的开发中很少会使用到数组,因为对于数组的大小大多数情况下我们是不能事先就确定好的,所以他不够灵活。动态数组通过提供自动扩容的机制,极大地提升了开发效率。这…...

Android Exoplayer 实现多个音视频文件混合播放以及音轨切换

在之前的文章ExoPlayer中常见MediaSource子类的区别和使用场景中介绍了Exoplayer中各种子MediaSource的使用场景,这篇我们着重详细介绍下实现多路流混合播放的用法。常见的使用场景有:视频文件电影字幕、正片视频广告视频、背景视频背景音乐等。 初始化…...

深入浅出:Java 中的动态类加载与编译技术

1. 引言 Java 的动态性是其强大功能之一,允许开发者在运行时加载和编译类,从而构建灵活、可扩展的应用程序。动态类加载和编译在许多高级场景中至关重要,例如插件系统、动态代理、框架开发(如 Spring)和代码生成工具。Java 提供了两大核心机制来实现这一目标: 自定义 Cl…...

js常用的数组遍历方式

以下是一个完整的示例,将包含图片、文字和数字的数组渲染到 HTML 页面,使用 ​多种遍历方式​ 实现不同的渲染效果: 1. 准备数据(数组) const items [{ id: 1, name: "苹果", price: 5.99, image: "h…...

【网络编程】五、三次握手 四次挥手

文章目录 Ⅰ. 三次握手Ⅱ. 建立连接后的通信Ⅲ. 四次挥手 Ⅰ. 三次握手 ​ 1、首先双方都是处于未通信的状态,也就是关闭状态 CLOSE。 ​ 2、因为服务端是为了服务客户端的,所以它会提前调用 listen() 函数进行对客户端请求的监听。 ​ 3、接着客户端就…...

【类拷贝文件的运用】

常用示例 当我们面临将文本文件分成最大大小块的时,我们可能会尝试编写如下代码: public class TestSplit {private static final long maxFileSizeBytes 10 * 1024 * 1024; // 默认10MBpublic void split(Path inputFile, Path outputDir) throws IOException {…...

从 AGI 到具身智能体:解构 AI 核心概念与演化路径全景20250509

🤖 从 AGI 到具身智能体:解构 AI 核心概念与演化路径全景 作者:AI 应用实践者 在过去的几年中,AI 领域飞速发展,从简单的文本生成模型演进为今天具备复杂推理、感知能力的“智能体”系统。本文将从核心概念出发&#x…...

Docker Compose 的历史和发展

这张图表展示了Docker Compose从V1到V2的演变过程,并解释了不同版本的Compose文件格式及其支持情况。以下是对图表的详细讲解: Compose V1 No longer supported: Compose V1已经不再支持。Compose file format 3.x: 使用了版本3.x的Compose文件格式。 …...

ARMV8 RK3399 u-boot TPL启动流程分析 --crt0.S

上一篇介绍到start.S 最后一个指令是跳转到_main, 接下来分析 __main 都做了什么 arch/arm/lib/crt0.S __main 注释写的很详细,主要分为5步 1. 准备board_init_f的运行环境 2. 跳转到board_init_f 3. 设置broad_init_f 申请的stack 和 GD 4. 完整u-boot 执行re…...

从 JIT 即时编译一直讲到CGI|FastGGI|WSGI|ASGI四种协议的实现细节

背景 我一度理解错了这个东西,之前没有AI的时候,也没深究过,还觉得PHP8支持了常驻内存的运行的错误理解,时至今日再来看这个就很清晰了。 另外,早几年对以上4个协议,我也没搞懂,时至今日&…...

Vue.js 页面切换空白与刷新 404 问题深度解析

在使用 Vue.js 开发单页应用 (SPA) 的过程中,开发者经常会遇到两个常见问题:页面切换时出现短暂的空白屏幕,以及刷新页面时返回 404 错误。这两个问题不仅影响用户体验,还可能阻碍项目的正常上线。本文将深入探讨这两个问题的成因…...

CSS3 遮罩

在网页设计中,我们经常需要实现一些特殊的视觉效果来增强用户体验。CSS3 遮罩(mask)允许我们通过控制元素的可见区域来创建各种精美的视觉效果。本文将带你全面了解 CSS3 遮罩的功能和应用。 什么是 CSS3 遮罩? CSS3 遮罩是一种…...

ResNet残差神经网络的模型结构定义(pytorch实现)

ResNet残差神经网络的模型结构定义(pytorch实现) ResNet‑34 ResNet‑34的实现思路。核心在于: 定义残差块(BasicBlock)用 _make_layer 方法堆叠多个残差块按照 ResNet‑34 的通道和层数配置来搭建网络 import torch…...

uniapp|商品列表加入购物车实现抛物线动画效果、上下左右抛入、多端兼容(H5、APP、微信小程序)

以uniapp框架为基础,详细解析商品列表加入购物车抛物线动画的实现方案。通过动态获取商品点击位置与购物车坐标,结合CSS过渡动画模拟抛物线轨迹,实现从商品图到购物车图标的动态效果。 目录 核心实现原理坐标动态计算抛物线轨迹模拟​动画元素控制代码实现详解模板层设计脚本…...

谈AI/OT 的融合

过去的十几年间,工业界讨论最多的话题之一就是IT/OT 融合,现在,我们不仅要实现IT/OT 的融合,更要面向AI/OT 的融合。看起来不太靠谱,却留给我们无限的想象空间。OT 领域的专家们不要再当“九斤老太”,指责这…...

USB传输模式

USB有四种传输模式: 控制传输, 中断传输, 同步传输, 批量传输 1. 中断传输 中断传输一般用于小批量, 非连续的传输. 对实时性要求较高. 常见的使用此传输模式的设备有: 鼠标, 键盘等. 要注意的是, 这里的 “中断” 和我们常见的中断概念有差异. Linux中的中断是设备主动发起的…...

Tomcat的`context.xml`配置详解!

全文目录: 开篇语前言一、context.xml 文件的基本结构二、常见的 context.xml 配置项1. **数据源(DataSource)配置**示例: 2. **日志配置**示例: 3. **设置环境变量(Environment Variables)**示…...

MapReduce 的工作原理

MapReduce 是一种分布式计算框架,用于处理和生成大规模数据集。它将任务分为两个主要阶段:Map 阶段和 Reduce 阶段。开发人员可以使用存储在 HDFS 中的数据,编写 Hadoop 的 MapReduce 任务,从而实现并行处理1。 MapReduce 的工作…...

.NET10 - 尝试一下Open Api的一些新特性

1.简单介绍 .NET9中Open Api有了很大的变化,在默认的Asp.NET Core Web Api项目中,已经移除了Swashbuckle.AspNetCore package,同时progrom中也变更为 builder.Servers.AddOpenApi() builder.Services.MapOpenApi() 2025年微软将发布…...

RabbitMQ 工作模式

RabbitMQ 一共有 7 中工作模式,可以先去官网上了解一下(一下截图均来自官网):RabbitMQ 官网 Simple P:生产者,要发送消息的程序;C:消费者,消息的接受者;hell…...

基于C++的多线程网络爬虫设计与实现(CURL + 线程池)

在当今大数据时代,网络爬虫作为数据采集的重要工具,其性能直接决定了数据获取的效率。传统的单线程爬虫在面对海量网页时往往力不从心,而多线程技术可以充分利用现代多核CPU的计算能力,显著提升爬取效率。本文将详细介绍如何使用C…...

Android11.0 framework第三方无源码APP读写断电后数据丢失问题解决

1.前言 在11.0中rom定制化开发中,在某些产品开发中,在某些情况下在App用FileOutputStream读写完毕后,突然断电 会出现写完的数据丢失的问题,接下来就需要分析下关于使用FileOutputStream读写数据的相关流程,来实现相关 功能 2.framework第三方无源码APP读写断电后数据丢…...

国产大模型「五强争霸」:决战AGI,谁主沉浮?

引言 中国AI大模型市场正经历一场史无前例的洗牌!曾经“百模混战”的局面已落幕,字节、阿里、阶跃星辰、智谱和DeepSeek五大巨头强势崛起,形成“基模五强”新格局。这场竞争不仅是技术实力的较量,更是资源、人才与生态的全面博弈。…...

【Python 基础语法】

Python 基础语法是编程的基石,以下从核心要素到实用技巧进行系统梳理: 一、代码结构规范 缩进规则 使用4个空格缩进(PEP 8标准)缩进定义代码块(如函数、循环、条件语句) def greet(name):if name: # 正确缩…...

【日撸 Java 三百行】Day 11(顺序表(一))

目录 Day 11:顺序表(一) 一、关于顺序表 二、关于面向对象 三、代码模块分析 1. 顺序表的属性 2. 顺序表的方法 四、代码及测试 拓展: 小结 Day 11:顺序表(一) Task: 在《数…...

path环境变量满了如何处理,分割 PATH 到 Path1 和 Path2

要正确设置 Path1 的值,你需要将现有的 PATH 环境变量 中的部分路径复制到 Path1 和 Path2 中。以下是详细步骤: 步骤 1:获取当前 PATH 的值 打开环境变量窗口: 按 Win R,输入 sysdm.cpl,点击 确定。在 系…...