답변:
다음은 다양한 접근 방식을 요약 한 문제에 대한 전체 논문입니다. 이를 문헌에서 구별 가치 추정 이라고 합니다.
공상 서류를 읽지 않고이 일을 직접해야한다면 이렇게해야합니다. 언어 모델을 만들 때 종종 많은 텍스트가 주어지면 이전에 알려지지 않은 단어를 관찰 할 확률을 추정해야합니다. 특히 언어 모델에서이 문제를 해결하는 데 아주 좋은 방법은 정확히 한 번 발생한 단어 수를 총 토큰 수로 나눈 값을 사용하는 것입니다. 이를 Good Turing Estimate 라고합니다 .
u1은 m 개 항목의 샘플에서 정확히 한 번 발생한 값의 수입니다.
P[new item next] ~= u1 / m.
크기 m의 표본에서 고유 항목의 수를 u로하자.
더 많은 데이터를 얻었을 때 '다음 새 항목'비율이 줄어들지 않았다고 잘못 가정 한 경우 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