假设我有一大组值,有时会重复。我希望估计大集合中唯一值的总数。
如果我随机抽取值样本,并确定它包含唯一值,我可以用它来估计大集合中唯一值的数量吗?
假设我有一大组值,有时会重复。我希望估计大集合中唯一值的总数。
如果我随机抽取值样本,并确定它包含唯一值,我可以用它来估计大集合中唯一值的数量吗?
这是关于该问题的整篇论文,并总结了各种方法。它在文献中被称为Distinct Value Estimation。
如果我必须自己这样做,而无需阅读精美的论文,我会这样做。在构建语言模型时,通常必须在给定一堆文本的情况下估计观察到以前未知单词的概率。特别是对于语言模型来说,解决这个问题的一个很好的方法是使用恰好出现一次的单词数除以标记的总数。它被称为良好的图灵估计。
设 u1 是在 m 个项目的样本中恰好出现一次的值的数量。
P[new item next] ~= u1 / m.
让 u 为大小为 m 的样本中唯一项目的数量。
如果您错误地假设“下一个新项目”的比率没有随着您获得更多数据而降低,那么使用 Good Turing,您将拥有
total uniq set of size s ~= u + u1 / m * (s - m)
这有一些令人讨厌的行为,因为 u1 变得非常小,但在实践中这对您来说可能不是问题。
模拟策略
从集合S中收集m个大小为n的随机样本。对于m个样本中的每一个,计算唯一值的数量u并除以n以进行归一化。根据标准化u的模拟分布,计算感兴趣的汇总统计数据(例如,均值、方差、四分位距)。将归一化u的模拟平均值乘以S的基数以估计唯一值的数量。
m和n越大,您的模拟平均值与唯一值的真实数量越接近。
这个任务有一个 python 包estndv
。例如,您的样本是 [1,1,1,3,5,5,12],原始大集有 100000 个值:
from estndv import ndvEstimator
estimator = ndvEstimator()
ndv = estimator.sample_predict(S=[1,1,1,3,5,5,12], N=100000)
ndv
是大集合的唯一/不同值的估计数。该方法在基于采样的唯一值数量估计上取得了最好的结果,见论文:https ://vldb.org/pvldb/vol15/p272-wu.pdf
这是熊猫的一个实现:
import math
import numpy as np
from collections import Counter
def estimate_uniqueness(df, col, r=10000, n=None):
""" Draws a sample of size r from column col from dataframe df and
returns an estimate for the number of unique values given a
population size of n """
n = n or df.shape[0]
sample = df[col][np.random.randint(0, n, r)]
counts = sample.value_counts()
fis = Counter(counts)
estimate = math.sqrt(n / r) * fis[1] + sum([fis[x] for x in fis if x > 1])
return estimate
依赖于本文的第 2 节和第 4 节:http: //ftp.cse.buffalo.edu/users/azhang/disc/disc01/cd1/out/papers/pods/towardsestimatimosur.pdf