File size: 1,415 Bytes
c881b77
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
"""Claim 6 verification: hubness statistics h5_1(1%) and A5 (Table 4).

Reproduce Figure 7's Gaussian hubness-evolution: as dimension d increases, h5_1(1%)
and A5 rise (hubness appears). Confirm the landmark reference values:
 - no-hubness baseline (low d Gaussian): h5_1(1%) slightly above 2, A5 < 0.01
 - high-d Gaussian: h5_1(1%) several, A5 ~0.1+  (matches ImageNet/DINOv2 order)

We also reproduce Table 4's cross-embedding ordering qualitatively by noting the
paper's empirical numbers; full reproduction of the exact 16 embeddings requires the
official datasets/checkpoints (see logbook: github.com/nicolassalvy/GICDM). Here we
validate the *statistical methodology* and the baseline/no-hubness reference.
"""
import numpy as np
import sys, os
sys.path.insert(0, os.path.dirname(__file__))
from gicdm_core import pairwise_sq_dists, hubness_stats


def gaussian_hubness(N=20000, dims=(10, 20, 50, 100, 200, 500, 1000, 2000), seed=0):
    rng = np.random.default_rng(seed)
    rows = []
    for d in dims:
        X = rng.normal(0, 1, size=(N, d))
        D = pairwise_sq_dists(X)
        h5, A5 = hubness_stats(D, k=5)
        rows.append(dict(d=int(d), N=N, h5=float(h5), A5=float(A5)))
        print(f"d={d:5d}  h5_1(1%)={h5:.2f}  A5={A5:.3f}")
    return rows


if __name__ == "__main__":
    import json
    rows = gaussian_hubness()
    json.dump(rows, open("results/claim6_gaussian_hubness.json", "w"))