有噪声的聚合函数

概述

有噪声的聚合函数是提供常见聚合(如 sum()count()approx_distinct())以及草图(如 approx_set())的随机、有噪声近似的函数。通过在结果中注入随机噪声,有噪声的聚合函数使确定或确认聚合的精确数据变得更加困难。

虽然许多这些函数类似于 差分隐私 机制,但这些函数返回的值或包含这些函数的查询结果通常不是差分私有的。有关更多详细信息,请参阅下面的 局限性。希望支持强隐私保证的用户应首先与合适的技术专家进行讨论。

计数、求和和平均值

noisy_count_gaussian(col, noise_scale[, random_seed]) -> bigint()

计算 col 中非 NULL 值的数量,然后向真实计数添加一个均值为 0、标准差为 noise_scale 的正态分布随机双精度值。有噪声的计数经过后处理以确保其非负并四舍五入为 bigint。

如果提供,random_seed 用于为随机数生成器设置种子。否则,噪声来自安全的随机数。

SELECT noisy_count_gaussian(orderkey, 20.0) FROM tpch.tiny.lineitem; -- 60179 (1 row)
SELECT noisy_count_gaussian(orderkey, 20.0) FROM tpch.tiny.lineitem WHERE false; -- NULL (1 row)

注意

count() 不同,当 col 的(真实)计数为 0 时,此函数返回 NULL

可以使用 noisy_count_gaussian(DISTINCT col, ...)noisy_approx_distinct_sfm() 执行去重计数。一般来说,noisy_count_gaussian() 返回更准确的结果,但计算成本更高。

noisy_count_if_gaussian(col, noise_scale[, random_seed]) -> bigint()

计算 colTRUE 值的数量,然后向真实计数添加一个均值为 0、标准差为 noise_scale 的正态分布随机双精度值。有噪声的计数经过后处理以确保其非负并四舍五入为 bigint。

如果提供,random_seed 用于为随机数生成器设置种子。否则,噪声来自安全的随机数。

SELECT noisy_count_if_gaussian(orderkey > 10000, 20.0) FROM tpch.tiny.lineitem; -- 50180 (1 row)
SELECT noisy_count_if_gaussian(orderkey > 10000, 20.0) FROM tpch.tiny.lineitem WHERE false; -- NULL (1 row)

注意

count_if() 不同,当(真实)计数为 0 时,此函数返回 NULL

noisy_sum_gaussian(col, noise_scale, lower, upper[, random_seed]) -> double()

计算 col 中输入值的总和,然后添加一个均值为 0、标准差为 noise_scale 的正态分布随机双精度值。每个值在添加到总和之前都被剪裁到 [lower, upper] 范围内。

如果提供,random_seed 用于为随机数生成器设置种子。否则,噪声来自安全的随机数。

noisy_sum_gaussian(col, noise_scale[, random_seed]) -> double()

计算 col 中输入值的总和,然后添加一个均值为 0、标准差为 noise_scale 的正态分布随机双精度值。

如果提供,random_seed 用于为随机数生成器设置种子。否则,噪声来自安全的随机数。

noisy_avg_gaussian(col, noise_scale, lower, upper[, random_seed]) -> double()

计算 col 中所有输入值的平均值(算术平均值),然后添加一个均值为 0、标准差为 noise_scale 的正态分布随机双精度值。每个值在求平均值之前都被剪裁到 [lower, upper] 范围内。

如果提供,random_seed 用于为随机数生成器设置种子。否则,噪声来自安全的随机数。

noisy_avg_gaussian(col, noise_scale[, random_seed]) -> double()

计算 col 中所有输入值的平均值(算术平均值),然后添加一个均值为 0、标准差为 noise_scale 的正态分布随机双精度值。

如果提供,random_seed 用于为随机数生成器设置种子。否则,噪声来自安全的随机数。

近似去重计数/草图

有噪声的近似去重计数和草图(类似于确定性 HyperLogLog 函数)通过 Sketch-Flip-Merge (SFM) 数据草图 [Hehir2023] 支持。

noisy_approx_set_sfm(col, epsilon[, buckets[, precision]]) -> SfmSketch()

返回 col 中输入值的 SFM 草图。这类似于 approx_set() 函数,该函数返回一个(确定性)HyperLogLog 草图。

  • col 支持多种类型,类似于 HyperLogLog

  • epsilon (双精度浮点数) 是一个正数,用于控制草图中的噪声级别,如 [Hehir2023] 中所述。较小的 epsilon 值对应于更嘈杂的草图。

  • buckets (整数) 默认值为 4096。

  • precision (整数) 默认值为 24。

注意

approx_set() 不同,当 col 为空时,此函数返回 NULL。如果此行为不可取,请将 coalesce()noisy_empty_approx_set_sfm() 一起使用。

noisy_approx_set_sfm_from_index_and_zeros(col_index, col_zeros, epsilon, buckets[, precision]) -> SfmSketch()

返回 col_indexcol_zeros 中输入值的 SFM 草图。

这类似于 noisy_approx_set_sfm(),但该函数计算 colMurmur3Hash128.hash64(),并根据 [FlajoletMartin1985] 中的描述计算 SFM PCSA 桶索引和尾随零的数量。在此函数中,调用者必须显式计算哈希桶索引和零本身,并将它们作为参数 col_indexcol_zeros 传递。

  • col_index (大整数) 必须在 0..buckets-1 范围内。

  • col_zeros (大整数) 必须在 0..64 范围内。如果它超过 precision,则将其裁剪为 precision-1

  • epsilon (双精度浮点数) 是一个正数,用于控制草图中的噪声级别,如 [Hehir2023] 中所述。较小的 epsilon 值对应于更嘈杂的草图。

  • buckets (整数) 是 SFM PCSA 草图中桶的数量,如 [Hehir2023] 中所述。

  • precision (整数) 默认值为 24。

注意

noisy_approx_set_sfm() 类似,当 col_indexcol_zerosNULL 时,此函数返回 NULL。如果此行为不可取,请将 coalesce()noisy_empty_approx_set_sfm() 一起使用。

noisy_approx_distinct_sfm(col, epsilon[, buckets[, precision]]) -> bigint()

等效于 cardinality(noisy_approx_set_sfm(col, epsilon, buckets, precision)),它返回列 col 的近似基数(不同的计数)。这类似于(确定性的)approx_distinct() 函数。

注意

approx_distinct() 不同,当 col 为空时,此函数返回 NULL

noisy_empty_approx_set_sfm(epsilon[, buckets[, precision]]) -> SfmSketch()

返回一个没有项目的 SFM 草图。这类似于 empty_approx_set() 函数,该函数返回一个空的(确定性的)HyperLogLog 草图。

  • epsilon (双精度浮点数) 是一个正数,用于控制草图中的噪声级别,如 [Hehir2023] 中所述。较小的 epsilon 值对应于更嘈杂的草图。

  • buckets (整数) 默认值为 4096。

  • precision (整数) 默认值为 24。

cardinality(SfmSketch) -> bigint()

返回 SfmSketch 对象的估计基数(不同的计数)。

merge(SfmSketch) -> SfmSketch()

一个聚合函数,它返回一个合并的 SfmSketch,它表示单个 SfmSketch 对象的集合并,类似于 merge(HyperLogLog)

SELECT year, cardinality(merge(sketch)) AS annual_distinct_count
FROM monthly_sketches
GROUP BY 1
merge_sfm(ARRAY[SfmSketch, ...]) -> SfmSketch()

一个标量函数,它返回一个合并的 SfmSketch,它表示 SfmSketch 对象数组的集合并,类似于 merge_hll()

SELECT cardinality(merge_sfm(ARRAY[
    noisy_approx_set_sfm(col_1, 5.0),
    noisy_approx_set_sfm(col_2, 5.0),
    noisy_approx_set_sfm(col_3, 5.0)
])) AS distinct_count_over_3_cols
FROM my_table

限制

虽然这些函数类似于差分隐私机制,但这些函数返回的值一般来说不是差分私密的。在将这些函数用于隐私保护目的时,需要牢记几个重要的限制,包括

  • 所有嘈杂聚合函数在聚合空集时返回 NULL。这意味着 NULL 返回值无噪声地表示没有数据。

  • GROUP BY 子句与嘈杂聚合函数结合使用时,会显示无噪声信息:组的存在或不存在无噪声地表示数据的存在或不存在。例如,请参阅 [Wilkins2024]

  • 依赖于浮点数噪声的函数可能容易受到推断攻击,例如在 [Mironov2012][Casacuberta2022] 中发现的攻击。


[Casacuberta2022]

Casacuberta, S., Shoemate, M., Vadhan, S., & Wagaman, C. (2022)。差分私有库中普遍存在对敏感性的低估及其解决方法。 发表在 2022 年 ACM 计算机与通信安全会议论文集(第 471-484 页)中。

[Hehir2023] (1,2,3,4,5)

Hehir, J., Ting, D., & Cormode, G. (2023)。Sketch-Flip-Merge:用于私有不同计数的可合并草图。 发表在第 40 届国际机器学习大会论文集(第 202 卷)中。

[Mironov2012]

Mironov, I. (2012)。关于最不重要位对差分隐私的重要性。 发表在 2012 年 ACM 计算机与通信安全会议论文集(第 650-661 页)中。

[Wilkins2024]

Wilkins, A., Kifer, D., Zhang, D., & Karrer, B. (2024)。高斯稀疏直方图机制的精确隐私分析。 发表在《隐私与保密杂志》第 14 卷第 1 期中。

[FlajoletMartin1985]

Flajolet, P, Martin, G. N. (1985)。用于数据库应用程序的概率计数算法。 发表在《计算机与系统科学杂志》第 31 卷(第 182-209 页,1985 年)中。