File size: 2,507 Bytes
cc68c45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
"""Claim 1 (Theorem 2): training on an admissible subset attains the minimax rate
O(sqrt(d/(N lambda_k))). Tested as an exponent fit on n and, separately, on d --
a rate claim has two exponents and fitting only one leaves the other unchecked.
"""
import json, numpy as np
from screen_exp import population, draw, estimate_subspace, subspace_error, screen

RES = json.load(open("screen_results.json"))


def rate_vs_n():
    d, k, N, m = 30, 6, 99, 33
    B, srcs = population(d, k, N)
    sel = screen(srcs, m)
    ns, errs = [], []
    for n in (20, 40, 80, 160, 320, 640):
        e = []
        for rep in range(8):
            rng = np.random.default_rng(700+rep)
            ds = [draw(srcs[i], n, rng) for i in sel]
            e.append(subspace_error(estimate_subspace(ds, k), B))
        ns.append(n); errs.append(float(np.mean(e)))
        print("   n/src=%-4d  subspace err=%.5f" % (n, errs[-1]), flush=True)
    sl, ic = np.polyfit(np.log(ns), np.log(errs), 1)
    r2 = 1-np.var(np.log(errs)-(sl*np.log(ns)+ic))/np.var(np.log(errs))
    print("  exponent on n: %.4f (predicted -0.5), R2 %.4f" % (sl, r2), flush=True)
    return {"n_per_source": ns, "errors": [round(x, 6) for x in errs],
            "fitted_exponent": round(float(sl), 4), "predicted": -0.5,
            "r2": round(float(r2), 4)}


def rate_vs_d():
    k, N, m, n = 6, 99, 33, 200
    ds_, errs = [], []
    for d in (12, 20, 30, 45, 60):
        B, srcs = population(d, k, N, seed=d)
        sel = screen(srcs, m)
        e = []
        for rep in range(6):
            rng = np.random.default_rng(800+rep)
            data = [draw(srcs[i], n, rng) for i in sel]
            e.append(subspace_error(estimate_subspace(data, k), B))
        ds_.append(d); errs.append(float(np.mean(e)))
        print("   d=%-4d  subspace err=%.5f" % (d, errs[-1]), flush=True)
    sl, ic = np.polyfit(np.log(ds_), np.log(errs), 1)
    r2 = 1-np.var(np.log(errs)-(sl*np.log(ds_)+ic))/np.var(np.log(errs))
    print("  exponent on d: %.4f (predicted +0.5), R2 %.4f" % (sl, r2), flush=True)
    return {"d": ds_, "errors": [round(x, 6) for x in errs],
            "fitted_exponent": round(float(sl), 4), "predicted": 0.5,
            "r2": round(float(r2), 4)}


if __name__ == "__main__":
    RES["claim1_minimax_rate"] = {"vs_n": rate_vs_n(), "vs_d": rate_vs_d(),
                                  "note": "sqrt(d/(N lambda_k)) predicts err ~ n^-1/2 and ~ d^+1/2"}
    json.dump(RES, open("screen_results.json", "w"), indent=1)
    print("DONE")