File IS_stat.py changed (mode: 100644) (index e556c1e..cb3c179) |
... |
... |
import collections # for defaultdict |
11 |
11 |
from .candybox import CandyBox |
from .candybox import CandyBox |
12 |
12 |
from scipy import stats # for sample_like() |
from scipy import stats # for sample_like() |
13 |
13 |
from . import f_models # for sample_like() |
from . import f_models # for sample_like() |
|
14 |
|
from .spring import get_spring_solution # for new IS function, for ISSI in future |
|
15 |
|
|
|
16 |
|
|
|
17 |
|
#č chcu udělat menší IS funkci s výrovnáním odhadů |
|
18 |
|
#č Síce tohle už umí ISSI, |
|
19 |
|
#č třída ale neočekává celkovou pravděpodobnost odlišnou od nuly. |
|
20 |
|
#č Taky jeji funkcionalita je hodně přebytečná pro Ghull. |
|
21 |
|
#č Zkratka, chcu funkci, která by na vstupu brala: |
|
22 |
|
#č 1. vahy IS (tj. funkce nebude řešít souřadnice a hustoty) |
|
23 |
|
#č 2. roušku (omezíme se na nejčastější případ dvou vzajemně vyloučujících jevů) a |
|
24 |
|
#č 3. celkovou pravděpodobnost |
|
25 |
|
#č a posleze vracela výrovnané odhady |
|
26 |
|
|
|
27 |
|
def get_IS_estimation(weights, mask, p_overall=1): |
|
28 |
|
"""Function calculates Importance Sampling estimators |
|
29 |
|
of two mutually excludive events (typical for indicator or Heaviside step function). |
|
30 |
|
It performs correction based on a priory known overall probability. |
|
31 |
|
It takes numpy array of IS weghts (PDF / weighting function density), |
|
32 |
|
numpy boolean array and a priory known overall probability. |
|
33 |
|
Returns corrected estimators for true_event and false_event""" |
|
34 |
|
|
|
35 |
|
#č vstupní kontroly |
|
36 |
|
if np.all(mask): #č všecko je pravda - není co řešit |
|
37 |
|
return p_overall, 0 |
|
38 |
|
if not np.any(mask): #č není žádná pravda - není žádné překvapení |
|
39 |
|
return 0, p_overall |
|
40 |
|
|
|
41 |
|
Nsim = len(weights) |
|
42 |
|
# there are two events: |
|
43 |
|
true_masked = weights[mask] |
|
44 |
|
false_masked = weights[~mask] |
|
45 |
|
#č podle IS vzorečků |
|
46 |
|
#č když uživatel bude hodně snažit, tak |
|
47 |
|
#č v mat. očekaváních může zajistit nuly |
|
48 |
|
#č nechcu zatím řešit |
|
49 |
|
true_mean = np.sum(true_masked)/Nsim |
|
50 |
|
false_mean = np.sum(false_masked)/Nsim |
|
51 |
|
if (true_mean + false_mean) == p_overall: |
|
52 |
|
return true_mean, false_mean |
|
53 |
|
#č podle toho, co vidím ve vzorcích - mám pocit, že se |
|
54 |
|
#č nůlový rozptyl může vyskytnout pouze v případě Nsim == 1, což |
|
55 |
|
#č zde od uživatele neočakávám. Nebo spolu s nulovým průměrem, |
|
56 |
|
#č který zatím taky nechcu řešit. |
|
57 |
|
#č (Ten ISSI je teda hrozně перемудрёный, řeší bůhvíco) |
|
58 |
|
#č Zde to nepotřebujem, udělame všecko jednoduše. |
|
59 |
|
true_var = (np.sum(true_masked**2)/Nsim - true_mean**2) / Nsim |
|
60 |
|
false_var = (np.sum(false_masked**2)/Nsim - false_mean**2) / Nsim |
|
61 |
|
|
|
62 |
|
#č pošleme to pružině. Ta je obecnější, na větší počet jevů |
|
63 |
|
#č proto bere jako vstup numpy matice |
|
64 |
|
lenghts = np.array((true_mean, false_mean)) |
|
65 |
|
flexibilities = np.array((true_var, false_var)) |
|
66 |
|
#č vrací taky numpy |
|
67 |
|
ls = get_spring_solution(lenghts, flexibilities, L=p_overall) |
|
68 |
|
#č rozbalíme |
|
69 |
|
#č (na rovinu, dělám to jen aby pak kód bylo možné jednoduše přečíst) |
|
70 |
|
true_corrected_mean, false_corrected_mean = ls |
|
71 |
|
|
|
72 |
|
return true_corrected_mean, false_corrected_mean #(*ls,) |
|
73 |
|
|
|
74 |
|
|
|
75 |
|
|
|
76 |
|
|
|
77 |
|
#č ISS a ISSI by bylo vhod předělat na spring a |
|
78 |
|
#č vyhodit ty blbosti s půlením intervalů. |
|
79 |
|
#č Nechám to na potom, po zakroku by bylo potřebné |
|
80 |
|
#č všecko dobře otestovat, teď na to nemám ani kapacitu, ani zajem |
|
81 |
|
#č Goal&Ghull ISSI nepotřebuje. |
14 |
82 |
|
|
15 |
83 |
# bisect function is taken from somewhere in internet. |
# bisect function is taken from somewhere in internet. |
16 |
84 |
# https://www.quora.com/How-does-one-correctly-compare-two-floats-in-Python-to-test-if-they-are-equal |
# https://www.quora.com/How-does-one-correctly-compare-two-floats-in-Python-to-test-if-they-are-equal |
|
... |
... |
def IS_like(f_plan, sampling_space='G', weights=None, nis=1000, d=1, design=None |
175 |
243 |
|
|
176 |
244 |
|
|
177 |
245 |
|
|
178 |
|
|
|
|
246 |
|
#č krucinal, vůbec si nepamatuji, |
|
247 |
|
#č co znaméná "TrueIS". |
|
248 |
|
#č Navíc, nemůžu najít žadné použití v kódu. |
|
249 |
|
#č Ty brďo, jaktože mám zde nějakou třídu, |
|
250 |
|
#č která není nikde použitá? |
|
251 |
|
#č Zřejmě, že mimo jiného pracuje se souřadnicemi. |
|
252 |
|
#č Má nějakou alfu, která "not used", je to asi něco hodně starého. |
|
253 |
|
#č Má metody pro výpočet vah a pro výpočet odhadů s nevím proč |
|
254 |
|
#č úpravenými vzorečky. |
|
255 |
|
#č Ok, kdyby něco, budem vědět. |
179 |
256 |
class TrueIS: |
class TrueIS: |
180 |
257 |
def __init__(self, f, IS_mode='G'): |
def __init__(self, f, IS_mode='G'): |
181 |
258 |
self.f_sample = f() |
self.f_sample = f() |