You've seen 100 species. How many exist?

Given nn observations from a discrete distribution, how much probability belongs to types you have not seen? The sample fingerprint – the counts of singletons, doubletons, and so on – supports a distribution-free estimator of that first quantity. It does not, by itself, identify how many unseen types exist or what their entropy contribution is; those questions require bounds, tail assumptions, or more data.

In the 1940s, the lepidopterist Alexander Corbet spent two years trapping butterflies in Malaya. He returned with a frequency table: 118 species observed exactly once, 74 observed twice, 44 three times, and so on. He brought the table to Ronald Fisher and asked: if I went back for another two years, how many new species would I find?

Fisher had to estimate a column of the table that didn’t exist: the zero column, the species Corbet never saw. Around the same time, at Bletchley Park, Alan Turing was working on the same problem in a different guise: estimating the probability of encountering a cipher pattern that had never appeared in intercepted traffic.

Both problems have the same structure: a finite sample from a fixed distribution whose support is unknown and possibly much larger than what you observed. The answer depends on the frequency of frequencies: how many species appeared exactly once, exactly twice, exactly three times, and so on. This vector is the fingerprint of the sample. It preserves what a label-invariant estimator can use, while discarding the species names.

# The fingerprint

Let X1,X2,…,XnX_1, X_2, \ldots, X_n be nn i.i.d. draws from a discrete distribution PP over an unknown support. Define:

ϕj=∣{i:species i was observed exactly j times}∣\phi_j = |\{i : \text{species } i \text{ was observed exactly } j \text{ times}\}|

The count ϕ1\phi_1 is the number of singletons (species seen exactly once), and ϕ2\phi_2 is the number of doubletons. The vector (ϕ1,ϕ2,…)(\phi_1, \phi_2, \ldots) is the fingerprint.

Bar chart showing the fingerprint (frequency of frequencies) of a sample
The fingerprint of counts [5, 4, 3, 2, 2, 1, 1, 1]. Three species appear once and two appear twice. The singleton fraction estimates missing probability mass; it does not by itself determine the number of unseen species.
Reproduce this figure
Download source bundleextract, then runtar -xf unseen-species-gen_fingerprint.tar && cd unseen-species-gen_fingerprint/unseen-species && uv run --locked gen_fingerprint.py

Requires uv and Python 3.12; the locked packages download on first run.

For a symmetric property, permuting the species labels does not change the target. Under a permutation-invariant loss, an estimator can therefore be symmetrized so that it depends only on the fingerprint, without worsening its worst-case risk.1 This is the useful invariance claim. It is not a universal privacy guarantee: a small or unusual fingerprint may itself disclose information, and non-symmetric questions still need the labels.

The singleton count ϕ1\phi_1 is large when there are many rare species, species you barely caught. If ϕ1\phi_1 is large relative to nn, you’ve probably missed a lot.

The code examples below use fingerprints, a Rust crate named after this data structure.

use fingerprints::Fingerprint;

let counts = [5usize, 4, 3, 2, 2, 1, 1, 1];
let fp = Fingerprint::from_counts(counts).unwrap();

assert_eq!(fp.sample_size(), 19);      // n = 5+4+3+2+2+1+1+1
assert_eq!(fp.observed_support(), 8);   // S_obs
assert_eq!(fp.singletons(), 3);         // phi_1
assert_eq!(fp.doubletons(), 2);         // phi_2

One fingerprint supports several questions, but they are not interchangeable:

Question Target What extra structure controls the answer
How much probability is unseen now? Missing mass M0M_0 iid draws from one fixed distribution
How many new types will a larger sample discover? Future discovery count iid sampling plus a stated extrapolation horizon
How many types exist in total? Support size SS a lower-bound target, a support/tail model, or a sensitivity range
How uncertain is a draw? Entropy H(P)H(P) a known support regime, asymptotics, or an explicit prior model

The next sections move through those targets in that order. A guarantee for one does not transfer to the next merely because all four can be estimated from the same fingerprint.

# Good-Turing: the probability of the unseen

Good (1953) gave an answer to “what fraction of the next observation will be a species we haven’t seen yet?”2

p^0=ϕ1n\hat{p}_0 = \frac{\phi_1}{n}

The missing mass (the total probability of all unseen species) is estimated by the fraction of singletons. If 3 of your 19 observations come from species seen only once, then roughly 3/19≈16%3/19 \approx 16\% of the distribution’s probability mass belongs to species you never saw.

Why does this work? First Poissonize the total sample size: draw N∼Pois(n)N\sim\text{Pois}(n) observations. Poisson splitting then makes the species counts independent, with

Ni∼Pois(npi).N_i\sim\text{Pois}(np_i).

For species ii,

Pr⁡(Ni=0)=e−npi,Pr⁡(Ni=1)=npie−npi.\Pr(N_i=0)=e^{-np_i}, \qquad \Pr(N_i=1)=np_i e^{-np_i}.

The random missing mass is M0=∑ipi1{Ni=0}M_{0}=\sum_{i} p_{i}\mathbf 1\{N_{i}=0\}, while ϕ1=∑i1{Ni=1}\phi_{1}=\sum_{i}\mathbf 1\{N_{i}=1\}. Taking expectations gives

E[M0]=∑ipie−npi=E ⁣[ϕ1n].\mathbb E[M_0] =\sum_i p_i e^{-np_i} =\mathbb E\!\left[\frac{\phi_1}{n}\right].

This is the complete Poissonized identity: a zero-count probability on one side becomes a singleton probability on the other. With exactly nn independent draws, the two expectations are close but not identical:

E ⁣[ϕ1n]=∑ipi(1−pi)n−1,E[M0]=∑ipi(1−pi)n.\mathbb{E}\!\left[\frac{\phi_1}{n}\right] = \sum_i p_i(1-p_i)^{n-1}, \qquad \mathbb{E}[M_0] = \sum_i p_i(1-p_i)^n.

The remaining bias is at most order 1/n1/n. Distribution-free concentration results control the random error uniformly over the choice of PP, but “distribution-free” does not mean assumption-free: the observations must still be independent draws from one fixed distribution.If the population drifts while you sample, ϕ1/n\phi_1/n mixes novelty with drift. No iid missing-mass theorem repairs that change of data-generating process.

The complementary quantity is sample coverage: C^=1−ϕ1/n\hat{C} = 1 - \phi_1/n. Coverage of 84% means the observed species account for 84% of draws from the underlying distribution.

Good-Turing estimated coverage closely following realized coverage as sample size grows
Good-Turing estimated coverage against the probability mass of the species actually observed. The finite Zipf distribution has 5,000 types, so both curves eventually approach one; there is no sub-unit asymptote. Three hundred trials per sample size, seed 42.
Reproduce this figure
Download source bundleextract, then runtar -xf unseen-species-completeness_curve.tar && cd unseen-species-completeness_curve/unseen-species && uv run --locked completeness_curve.py

Requires uv and Python 3.12; the locked packages download on first run.

More generally, Good-Turing smoothing reassigns probabilities to every frequency class: a species seen rr times gets estimated probability r~/n\tilde{r}/n where r~=(r+1)ϕr+1/ϕr\tilde{r} = (r+1)\phi_{r+1}/\phi_r.17This has a pathology at r=rmax⁡r = r_{\max}: the most frequent species gets probability zero because ϕrmax⁡+1=0\phi_{r_{\max}+1} = 0. Gale and Sampson (1995) fix this with log-linear smoothing of the frequency spectrum. The missing mass formula is the special case r=0r = 0.

There is a fundamental limit on species-count extrapolation. Orlitsky, Suresh, and Wu (2016) proved that predicting how many new species appear in t⋅nt \cdot n future samples works when t≲log⁡nt \lesssim \log n, but beyond that horizon no estimator is consistent.18 This result is about forecasting new-species counts, not about the missing mass estimator ϕ1/n\phi_1/n itself: under squared-error loss, missing-mass minimax risk is Θ(1/n)\Theta(1/n) with no phase transition. Its root-mean-square-error scale is therefore n−1/2n^{-1/2}.Rajaraman, Thangaraj, and Suresh (2017, arXiv:1705.05006) establish the minimax lower bound for missing-mass estimation under squared loss, with no analogue of the log n threshold.

Good formalized and published Turing’s wartime work in 1953.2 The same smoothing problem became central to statistical language modeling. Chen and Goodman’s 1998 survey16 compares Good-Turing discounting with backoff and interpolation methods, including Katz and Kneser–Ney.

A historical validation came from Efron and Thisted’s 1976 Shakespeare vocabulary study. They used the fingerprint of word frequencies in the known canon to predict how many new words would appear if an additional text were discovered.Shakespeare’s known works contain 31,534 distinct word types across roughly 884,000 tokens. Of those, 14,376 appear exactly once – hapax legomena. That ϕ1\phi_1 alone is 46% of the vocabulary. When an unknown poem attributed to “W.S.” surfaced in the Bodleian Library in 1985, their model predicted 6.97±2.646.97 \pm 2.64 new words. The actual count was 9. They also tested poems by Jonson, Marlowe, and Donne against the Shakespearean fingerprint; all failed.10

# A full-fingerprint correction

Good-Turing uses only ϕ1\phi_1. Lee and Böhme propose an alternating full-fingerprint correction:22

M^0MB=∑i=1rmax⁡(−1)i−1ϕi(ni)\hat{M}_0^{\text{MB}} = \sum_{i=1}^{r_{\max}} (-1)^{i-1} \frac{\phi_i}{\binom{n}{i}}

The first term is Good-Turing. Under their fixed-distribution sampling model, the later terms cancel its finite-sample bias more aggressively. That is a bias statement, not a dominance theorem: the alternating estimator can have higher variance, especially for skewed distributions, so mean-squared error can still favor the singleton estimate.

# How many species total?

# Chao1: estimating a lower-bound target

Chao (1984) gave a lower bound on the total number of species SS:3

S^Chao1=Sobs+ϕ122ϕ2\hat{S}_{\text{Chao1}} = S_{\text{obs}} + \frac{\phi_1^2}{2\phi_2}

The lower bound comes from one Cauchy–Schwarz step. In the Poissonized model, let fj=E[ϕj]f_j=\mathbb E[\phi_j] and write λi=npi\lambda_{i}=np_{i}. The expected numbers of unseen, singleton, and doubleton species are

f0=∑ie−λi,f1=∑ie−λiλi,2f2=∑ie−λiλi2.f_0=\sum_i e^{-\lambda_i}, \qquad f_1=\sum_i e^{-\lambda_i}\lambda_i, \qquad 2f_2=\sum_i e^{-\lambda_i}\lambda_i^2.

Applying Cauchy–Schwarz to the sequences e−λi/2e^{-\lambda_{i}/2} and e−λi/2λie^{-\lambda_{i}/2}\lambda_{i} gives

f12≤2f0f2,sof0≥f122f2.f_1^2\leq 2f_0f_2, \qquad\text{so}\qquad f_0\geq\frac{f_1^2}{2f_2}.

Because total support is observed species plus unseen species,

S=E[Sobs]+f0≥E[Sobs]+f122f2.S =\mathbb E[S_{\text{obs}}]+f_0 \geq\mathbb E[S_{\text{obs}}]+\frac{f_1^2}{2f_2}.

This is a lower bound expressed through expected frequency counts. Replacing those expectations with the observed ϕ1\phi_1 and ϕ2\phi_2 gives an estimator of that lower-bound target. The realized estimate is not guaranteed to lie below SS, nor is its finite-sample expectation always below SS.

The smallest counterexample needs only two equiprobable species and three draws. With probability 1/41/4, all draws match and Chao1 returns 1. Otherwise the counts are (2,1)(2,1) and it returns 2.52.5. Its expectation is therefore 2.1252.125, above the true support of 2:

from itertools import product

def chao1(sample):
    counts = [sample.count(0), sample.count(1)]
    f1 = sum(count == 1 for count in counts)
    f2 = sum(count == 2 for count in counts)
    observed = sum(count > 0 for count in counts)
    return observed + (f1 * f1 / (2 * f2) if f2 else f1 * (f1 - 1) / 2)

print(sum(chao1(list(sample)) for sample in product(range(2), repeat=3)) / 8)
# 2.125

The lower-bound interpretation remains useful: heterogeneous rare-species probabilities generally leave Chao1 below the total richness it is meant to estimate. It should be reported as a richness estimator derived from a lower bound, not as a one-sided finite-sample guarantee.

The ϕ12/2ϕ2\phi_1^2 / 2\phi_2 term estimates the unseen count from the ratio of singletons to doubletons. If you have many singletons but few doubletons, the singletons look like the tip of an iceberg.When ϕ2=0\phi_2 = 0, the formula divides by zero. Software implementations use the bias-corrected fallback Sobs+ϕ1(ϕ1−1)/2S_{\text{obs}} + \phi_{1}(\phi_{1} - 1)/2. Zero doubletons occur routinely in small samples from skewed distributions.

use fingerprints::{Fingerprint, support_chao1, support_chao1_with_ci};

let fp = Fingerprint::from_counts([5, 3, 2, 1, 1]).unwrap();
let s_hat = support_chao1(&fp);
assert!(s_hat >= fp.observed_support() as f64);

// With estimated variance and an approximate 95% interval:
let est = support_chao1_with_ci(&fp);
println!("[{:.1}, {:.1}, {:.1}]", est.ci_lower, est.point, est.ci_upper);

The log-transformed interval is an asymptotic uncertainty approximation. It is not a certificate that contains the true richness 95% of the time for every finite distribution.

A cautionary note: Chao1 is available as an alpha-diversity metric in microbiome tools like QIIME2 and mothur. Some ASV-denoising pipelines and settings remove singleton ASVs, destroying the singleton count that Chao1 depends on. Deng, Umbach, and Neufeld (2024) therefore warned that Chao1 “must not be used” with ASV data13 when that preprocessing has occurred. Check the actual pipeline: if it removes rare types before counting, ϕ1\phi_1 and ϕ2\phi_2 no longer mean what Chao1 thinks they mean.

# iChao1: pulling in higher frequencies

Chiu, Wang, Walther, and Chao (2014) improved the lower bound using ϕ3\phi_3 (tripletons) and ϕ4\phi_4 (quadrupletons):4

S^iChao1=S^Chao1+ϕ34ϕ4max⁡ ⁣(ϕ1−ϕ2ϕ32ϕ4,  0)\hat{S}_{\text{iChao1}} = \hat{S}_{\text{Chao1}} + \frac{\phi_3}{4\phi_4} \max\!\left(\phi_1 - \frac{\phi_2 \phi_3}{2\phi_4},\; 0\right)

When ϕ4=0\phi_4 = 0, the displayed correction is undefined; the fingerprints implementation falls back to Chao1. When ϕ3=0\phi_3 = 0, the correction is zero. Otherwise iChao1 is at least as large as Chao1 and uses more of the fingerprint. The correction term captures information about the tail that ϕ1\phi_1 and ϕ2\phi_2 alone miss.

# A linear-program sensitivity range

Valiant and Valiant showed how to estimate the unseen shape of a distribution, and hence symmetric properties such as support size and entropy, at optimal sample-complexity rates.5 The first result appeared at STOC 2011; the improved estimator appeared at NeurIPS 2013, not STOC 2013.

The local fingerprints crate contains a smaller VV-style research scaffold. It places the unknown probability histogram on a finite log-spaced grid, asks that its Poisson-expected fingerprint match the observed one within configurable tolerances, and minimizes or maximizes a property over the feasible set. Its endpoints depend on the grid, probability cutoff, and tolerance. They are sensitivity ranges for that discretized model, not distribution-free confidence intervals and not a reimplementation of the full VV theorem.

For the 19-observation fingerprint used throughout this post, the default configuration admits support from 8 to 143.707 types and entropy from 0.164 to 4.922 bits. Those endpoints are not estimates of the true properties. They are the answer to a narrower question: what can this particular finite grid and tolerance policy accommodate?

use fingerprints::{Fingerprint, to_bits};
use fingerprints::vv::{support_bounds_lp, entropy_bounds_lp, LpParams};

let fp = Fingerprint::from_counts([5, 4, 3, 2, 2, 1, 1, 1]).unwrap();
let params = LpParams::default_for(&fp);

let (s_lo, s_hi) = support_bounds_lp(&fp, params.clone()).unwrap();
println!("grid-feasible support range: [{:.0}, {:.0}]", s_lo, s_hi);

let (h_lo, h_hi) = entropy_bounds_lp(&fp, params).unwrap();
println!("grid-feasible entropy range: [{:.2}, {:.2}] bits",
    to_bits(h_lo), to_bits(h_hi));

Changing one modeling knob changes the answer materially:

LP configuration Support range Entropy range (bits)
Default: 60 grid points, pmin⁡=1/192p_{\min}=1/19^2, tolerance 1.5 8.000–143.707 0.164–4.922
120 grid points 8.000–143.708 0.164–4.922
pmin⁡=1/(10⋅192)p_{\min}=1/(10\cdot19^2) 8.000–1356.917 0.023–5.907
Tighter tolerance 1.0 8.000–116.529 0.164–4.460

The coarser versus finer grid happens to be stable here; extending the low-probability tail is not. The version-pinned checker, manifest, and lockfile reproduce every row and the entropy values below with cargo run --locked --release.

# Entropy in the unseen regime

Missing mass asks how much probability lies beyond the sample. Entropy asks a different question: is that mass concentrated in one unseen species or spread over many? A small missing mass can have either contribution. Estimating Shannon entropy H=−∑ipilog⁡piH = -\sum_i p_i \log p_i from a finite sample is biased. The naive plug-in estimator H^=−∑ip^ilog⁡p^i\hat{H} = -\sum_i \hat{p}_i \log \hat{p}_i systematically underestimates HH because it misses unseen species entirely.

Keep the running fingerprint in view: the observed counts [5,4,3,2,2,1,1,1][5,4,3,2,2,1,1,1] have n=19n=19, eight observed species, and three singletons. Its plug-in entropy is 2.755 bits. Each method below answers for that same data, but with a different approximation or tail model. They are not successive rungs of one universally improving ladder.

The first three methods correct the empirical distribution in different asymptotic regimes. The minimax results discussed after them assume a known or bounded alphabet size. Pitman–Yor instead supplies an explicit model for a countably infinite, heavy-tailed alphabet.

# 1. Plug-in: the observed distribution

H^plug=−∑j≥1ϕj⋅jnln⁡ ⁣(jn)\hat{H}_{\text{plug}} = -\sum_{j \ge 1} \phi_j \cdot \frac{j}{n} \ln\!\left(\frac{j}{n}\right)

For the running fingerprint it gives 2.755 bits. It is negatively biased, and becomes useful when the empirically relevant support is well sampled; n≫Sn \gg S is a finite-support rule of thumb, not a universal threshold for heavy or countably infinite tails.

# 2. Miller-Madow: a first-order correction

H^MM=H^plug+Sobs−12n\hat{H}_{\text{MM}} = \hat{H}_{\text{plug}} + \frac{S_{\text{obs}} - 1}{2n}

A first-order bias correction due to Miller (1955).6 It adds 0.266 bits to the running fingerprint, giving 3.021 bits. Its leading-term derivation is a fixed-support asymptotic calculation; when Sobs≈nS_{\text{obs}} \approx n (many singletons), the correction can overshoot.

# 3. Jackknife: a delete-one correction

Under smooth, fixed-effective-support asymptotics, delete-one jackknifing removes the leading O(1/n)O(1/n) bias term, leaving an O(1/n2)O(1/n^2) term.7 Large or countably infinite supports need additional conditions and empirical calibration:

H^JK=nH^n−(n−1)E[H^n−1]\hat{H}_{\text{JK}} = n \hat{H}_n - (n-1) \mathbb{E}[\hat{H}_{n-1}]

Computed efficiently from the fingerprint without enumerating all leave-one-out samples. It gives 3.163 bits for the running fingerprint.

These three estimators do not exhaust the field. Jiao, Venkat, Han, and Weissman (2015) and Wu and Yang (2016) showed that polynomial-approximation estimators attain the minimax entropy rate when the alphabet size kk is known or bounded; consistent estimation begins around k/log⁡kk/\log k samples.19 Hao and Orlitsky (2019) gave a near-linear-time profile-likelihood method with sample-optimal guarantees for a broad class of additive symmetric properties under their regularity conditions.20 Those guarantees are property- and regime-specific, not a license to call every fingerprint-derived estimate optimal.

# 4. Pitman-Yor: a tail model

Archer, Park, and Pillow developed Bayesian entropy estimators for countably infinite alphabets and showed why power-law priors can help in undersampled regimes.8 The Pitman-Yor process has discount d∈[0,1)d \in [0, 1) and concentration α>−d\alpha > -d. For d>0d > 0, its expected number of occupied types grows polynomially rather than logarithmically as in the Dirichlet-process case.

The estimator in fingerprints is a different, newer construction: it implements the predictive-distribution method of Hashino and Tsukuda (2026) and selects (d,α)(d,\alpha) by minimizing their plug-in cross-entropy bound.23 For the running fingerprint it gives 3.837 bits with its fitted parameters. That implementation should be evaluated against the distributions and sample sizes where it will be used. The prior’s ability to express a power-law tail does not guarantee lower finite-sample error than a classical correction.

use fingerprints::{Fingerprint, entropy_pitman_yor_nats, pitman_yor_params_hat, to_bits};

let fp = Fingerprint::from_counts([5, 4, 3, 2, 2, 1, 1, 1]).unwrap();
let h_py = entropy_pitman_yor_nats(&fp);
let py = pitman_yor_params_hat(&fp);

println!("H = {:.3} bits  (d={:.3}, alpha={:.3})",
    to_bits(h_py), py.d, py.alpha);

# Checking finite-sample error

The observed fingerprint cannot tell us an estimator’s error because the underlying distribution is unknown. A controlled distribution with known entropy lets us measure that error across repeated samples.

One simulation trajectory can make any estimator look unusually good or bad. The figure below uses 400 independent trials at each sample size from a finite Zipf$(1.1)$ distribution over 5,000 types. The true entropy, computed directly from that normalized distribution, is 7.914183 bits.

Mean entropy error and 90 percent sampling bands for three estimators over repeated Zipf samples
Mean entropy error, with 5th–95th percentile bands, over 400 independent samples at each n. All three estimators underestimate in this experiment; the jackknife has the smallest bias and RMSE at every plotted size. Seed 20903.
Reproduce this figure
Download source bundleextract, then runtar -xf unseen-species-gen_convergence.tar && cd unseen-species-gen_convergence/unseen-species && uv run --locked gen_convergence.py

Requires uv and Python 3.12; the locked packages download on first run.

The figure’s source bundle runs all 400 trials at each sample size.

At n=50n=50, the mean errors are −3.1688-3.1688 bits for plug-in, −2.6838-2.6838 for Miller–Madow, and −2.2561-2.2561 for jackknife. At n=6400n=6400, they are −0.4136-0.4136, −0.2600-0.2600, and −0.1545-0.1545 bits. Those numbers describe this finite Zipf experiment, not a universal ordering. The generator reports both mean error and root-mean-square error at every point.

The Pitman-Yor implementation is not part of this comparison. Evaluating it fairly requires running the specified Rust implementation, including its parameter-selection policy, inside every replicate. Results from a different implementation do not establish its convergence behavior.

# When estimators disagree

Different estimators make different assumptions about the tail. Their spread is useful as a sensitivity diagnostic: it shows how much the answer moves when the modeling choice changes. It is not a confidence interval. Three wrong estimators can agree, and three noisy estimators can disagree even when one is well calibrated.

Question What the result means
Unseen probability mass Good-Turing estimates it under iid sampling from one fixed distribution
Conservative richness target Chao1 or iChao1 estimate a lower-bound target; neither is a finite-sample one-sided guarantee
Entropy with a known support bound Polynomial-approximation methods have minimax guarantees in specified (n,k)(n,k) regimes
Entropy under a power-law model A Pitman-Yor method is a model-based estimate whose calibration should be simulated
Local LP range The fingerprints VV-style scaffold measures sensitivity to its grid and tolerances

Report the estimand, assumptions, and a sampling uncertainty calculation that matches the estimator. Reporting several point estimates can supplement that work; it cannot replace it.

Two applications make the stakes concrete. In forensic DNA, when a suspect’s DNA profile matches a crime scene sample but has never appeared in the reference database, empirical frequency estimation gives a match probability of zero. That zero reflects the estimator rather than evidence that the profile is impossible. This is the missing mass problem directly: “what is the probability of a type we haven’t seen?” Favaro and Naulet (2023) frame it as a Good-Turing problem and prove optimal bounds.12

In software fuzzing, Böhme (2018) mapped the framework onto security testing: execution paths are species, fuzzer runs are samples. Good-Turing estimates the probability that another run discovers a path not yet observed.14 Adaptive fuzzers deliberately change that path-generating process, so the iid interpretation is a diagnostic approximation rather than an automatic theorem. If estimates disagree, the current fingerprint does not support a model-insensitive answer.

# The fingerprint everywhere

The same structure recurs far beyond ecology.

At the other end of the scale, HyperLogLog (Flajolet et al., 2007) estimates the number of distinct elements in a data stream, a related support-size question solved with hash-based sketches rather than an observed fingerprint.The distinction matters: ordinary HyperLogLog does not retain the sample’s frequency-of-frequencies vector. Cohen (2016) developed extensions that estimate richer frequency statistics from sketches. Implementations appear in Redis, Spark, and PostgreSQL via an extension.15

The German tank problem is a useful contrast. Consecutive serial numbers justify a uniform-with-unknown-endpoint model and the estimator N^=m+m/k−1\hat{N}=m+m/k-1, where mm is the largest observed serial and kk is the sample size. Species labels carry no such ordering. The broad question is similar, but the extra structure changes the mathematics.


The fingerprint separates related questions about incomplete sampling. It can estimate missing mass under iid sampling; support and entropy need additional structure; and sketches such as HyperLogLog answer a different support-size question with different retained information.

# References

[1] Acharya, Das, Orlitsky, Suresh, “A unified maximum likelihood approach for estimating symmetric properties of discrete distributions,” ICML 2017. ↩

[2] I.J. Good, “The population frequencies of species and the estimation of population parameters,” Biometrika 40(3/4), 237–264, 1953. The core idea is due to Turing; Good credits him explicitly but is the sole listed author. ↩

[3] Anne Chao, “Nonparametric estimation of the number of classes in a population,” Scandinavian Journal of Statistics 11(4), 265–270, 1984. ↩

[4] Chiu, Wang, Walther, Chao, “An improved nonparametric lower bound of species richness via a modified Good-Turing frequency formula,” Biometrics 70(3), 671–682, 2014. ↩

[5] Gregory Valiant, Paul Valiant, “Estimating the unseen: An n/log⁡nn/\log n-sample estimator for entropy and support size, shown optimal via new CLTs,” STOC, 685–694, 2011. Journal version: JACM 64(6), 2017. Follow-up: Paul Valiant and Gregory Valiant, “Estimating the Unseen: Improved Estimators for Entropy and other Properties,” NeurIPS 2013, 2157–2165. ↩

[6] G.A. Miller, “Note on the bias of information estimates,” in Information Theory in Psychology, Free Press, 95–100, 1955. Often called “Miller-Madow” by convention, though Madow is not a co-author. ↩

[7] S. Zahl, “Jackknifing an index of diversity,” Ecology 58(4), 907–913, 1977. ↩

[8] Evan Archer, Il Memming Park, Jonathan W. Pillow, “Bayesian entropy estimation for countable discrete distributions,” JMLR 15, 2833–2868, 2014. Conference version: NeurIPS 2012. ↩

[10] Bradley Efron, Ronald Thisted, “Estimating the number of unseen species: How many words did Shakespeare know?”, Biometrika 63(3), 435–447, 1976. The validation: Thisted and Efron, “Did Shakespeare write a newly-discovered poem?”, Biometrika 74(3), 445–455, 1987. ↩

[12] Favaro, Naulet, “Optimal estimation of high-order missing masses, and the rare-type match problem,” arXiv:2306.14998, 2023. ↩

[13] Deng, Umbach, Neufeld, “Nonparametric richness estimators Chao1 and ACE must not be used with amplicon sequence variant data,” The ISME Journal, 2024. ↩

[14] Marcel Böhme, “STADS: Software Testing as Species Discovery,” ACM TOSEM 27(2), 2018. ↩

[15] Flajolet, Fusy, Gandouet, Meunier, “HyperLogLog: the analysis of a near-optimal cardinality estimation algorithm,” AofA, 2007. Cohen, “HyperLogLog Hyper Extended,” arXiv:1607.06517, 2016. ↩

[16] Chen, S. F. & Goodman, J. (1998). “An empirical study of smoothing techniques for language modeling.” Technical Report TR-10-98, Harvard University. ↩

[17] Gale, W. A. & Sampson, G. (1995). “Good-Turing frequency estimation without tears.” Journal of Quantitative Linguistics, 2(3), 217–237. ↩

[18] Orlitsky, A., Suresh, A. T. & Wu, Y. (2016). “Optimal prediction of the number of unseen species.” Proceedings of the National Academy of Sciences, 113(47), 13283–13288. ↩

[19] Jiao, J., Venkat, K., Han, Y. & Weissman, T. (2015). “Minimax estimation of functionals of discrete distributions.” IEEE Transactions on Information Theory, 61(5), 2835–2885. arXiv:1406.6956. Wu & Yang (2016, arXiv:1407.0381) give tight constants for entropy. ↩

[20] Hao, Y. & Orlitsky, A. (2019). “The Broad Optimality of Profile Maximum Likelihood.” NeurIPS 2019. ↩

[22] Lee, S. & Böhme, M. (2025). “How Much is Unseen Depends Chiefly on Information About the Seen.” ICLR 2025. ↩

[23] Hashino, T. & Tsukuda, K. (2026). “Estimating the Shannon Entropy Using the Pitman–Yor Process.” arXiv:2602.08347. ↩