Answers:
这是有关该问题的全文,并总结了各种方法。在文献中,这被称为“ 不同价值估计 ”。
如果我必须自己做,而又不看花哨的论文,那我会做。在建立语言模型中,给定一堆文本,通常必须估计观察到一个先前未知单词的概率。特别是对于语言模型,解决此问题的一种很好的方法是使用刚出现一次的单词数除以标记总数。这就是所谓的好图灵估计。
令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
在这种情况下?“单词”的总数?
s
在左右手大小上都发生两次吗?
仿真策略
从集合S中收集大小为n的m个随机样本。对于m个样本中的每个样本,计算唯一值的数量u并除以n进行归一化。从归一化u的模拟分布,计算出感兴趣的摘要统计信息(例如,均值,方差,四分位间距)。将标准化u的模拟平均值乘以S的基数,以估计唯一值的数量。
m和n越大,您的模拟均值将越接近真实值的唯一值。
这是熊猫的实现:
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