二元随机响应(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(永远不翻转) |
ε = 0 | 0.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+e1e1≈0.731 → 有 73.1% 概率返回 1(保留真实值)
- p = 1 1 + e 1 ≈ 0.269 p = \frac{1}{1 + e^1} ≈ 0.269 p=1+e11≈0.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} 1−flip_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)
恰好实现:
x | keep_mask | x ^ keep_mask | ~(x ^ keep_mask) | 结果解释 |
---|---|---|---|---|
0 | True | 1 | 0 | 保留 0 ✅ |
1 | True | 0 | 1 | 保留 1 ✅ |
0 | False | 0 | 1 | 翻转成 1 ✅ |
1 | False | 1 | 0 | 翻转成 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 值的张量时。
✅ 举个例子来说明:
设有两个值 a
和 b
,都在 {0, 1} 之间(也就是二值):
a | b | a + b | (a + b) % 2 | a ^ b (XOR) |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 1 | 1 |
1 | 1 | 2 | 0 | 0 |
✅ 在 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,点击 确定。在 系…...