回答:
ここに、さまざまなアプローチの要約とともに、問題に関する論文全体があります。文献では、個別値推定と呼ばれています。
派手な論文を読まずに自分でこれをしなければならなかったなら、私はそうします。言語モデルの構築では、多くのテキストが与えられた場合、以前は未知だった単語を観察する確率を推定する必要があります。特に言語モデルでこの問題を解決するための非常に良いアプローチは、トークンの総数で割った、一度だけ発生した単語の数を使用することです。これはGood Turing Estimateと呼ばれます。
u個を、m個のアイテムのサンプルで1回だけ発生した値の数とします。
P[new item next] ~= u1 / m.
uをサイズmのサンプルの一意のアイテムの数とします。
データを追加しても「新しいアイテムの次」のレートが低下しなかったと誤って仮定した場合、Good Turingを使用すると、
total uniq set of size s ~= u + u1 / m * (s - m)
これは、u1が非常に小さくなると厄介な動作をしますが、実際には問題にならないかもしれません。
s
この場合は何ですか?「単語」の総数は?
s
これで左手と右手の両方のサイズで2回発生しますか?
シミュレーション戦略
集合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