Come posso stimare i conteggi di eventi unici da un campionamento casuale di dati?


15

Diciamo che ho una grande serie di valori che a volte si ripetono. Vorrei stimare il numero totale di valori univoci nel set di grandi dimensioni.S

Se prendo un campione casuale di valori e stabilisco che contiene valori univoci , posso utilizzarlo per stimare il numero di valori univoci nell'insieme di grandi dimensioni?TTu


1
Puoi anche tenere conto del numero di copie di ciascun valore univoco nel campione? Mi colpisce che potrebbe aiutare.
Onestop,

@onestop, sì, potrei farlo
sanità mentale il

Risposte:


11

Ecco un intero articolo sul problema, con un riepilogo di vari approcci. Si chiama stima del valore distinto in letteratura.

Se dovessi farlo da solo, senza aver letto documenti fantasiosi, lo farei. Nella costruzione di modelli linguistici, si deve spesso stimare la probabilità di osservare una parola precedentemente sconosciuta, dato un mucchio di testo. Un approccio piuttosto valido per risolvere questo problema in particolare per i modelli linguistici consiste nell'utilizzare il numero di parole che si sono verificate esattamente una volta, diviso per il numero totale di token. Si chiama Good Turing Stima .

Sia u1 il numero di valori che si sono verificati esattamente una volta in un campione di m elementi.

P[new item next] ~= u1 / m.

Sia il numero di elementi unici nel campione di dimensioni m.

Se ritieni erroneamente che la tariffa "nuovo articolo successivo" non sia diminuita man mano che ottieni più dati, quindi utilizzando Good Turing, avrai

total uniq set of size s ~= u + u1 / m * (s - m) 

Questo ha un comportamento sgradevole in quanto diventa davvero piccolo, ma potrebbe non essere un problema per te in pratica.


cosa c'è sin questo caso? il numero totale di "parole"?
Nathan il

In effetti, si sverifica due volte in questo, sia sulla dimensione sinistra che destra?
PascalVKooten,

1

La strategia di simulazione

Raccogliere m campioni casuali di dimensione n dal set S . Per ciascuno dei m campioni, calcola il numero u di valori univoci e dividi per n per normalizzare. Dalla distribuzione simulata di u normalizzata , calcolare le statistiche riassuntive di interesse (ad esempio, media, varianza, intervallo interquartile). Moltiplicare la media simulata di u normalizzato per la cardinalità di S per stimare il numero di valori univoci.

Maggiore è m e n , più da vicino la media simulata corrisponderà al numero reale di valori univoci.


1
Questa soluzione non è forse una specie di zoppa? Non tiene affatto conto degli effetti di saturazione.
rrenaud,

@rrenaud Rispetto alla tua soluzione, sono d'accordo sul fatto che la mia appare inferiore.
Brash Equilibrium,

@rrenaud Continuo a sostenere una strategia di simulazione in base alla quale si calcola la probabilità di oggetti unici utilizzando GTFE su campioni il più possibile fattibili per avere un senso dell'errore di campionamento per la probabilità di oggetti unici. Oppure esiste una formula esplicita per calcolare tutti i momenti? Non penso che sia il binomio negativo poiché la distribuzione binomiale, secondo il riferimento di Wikipedia, non caratterizza la distribuzione del numero di elementi unici. Ma fantastico! Lo archiverò per dopo.
Brash Equilibrium,

0

Ecco un'implementazione per i panda:

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

Si affida alle sezioni 2 e 4 di questo documento: http://ftp.cse.buffalo.edu/users/azhang/disc/disc01/cd1/out/papers/pods/towardsestimatimosur.pdf

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.