Skip to content

Commit 79e1007

Browse files
add rarity.py
1 parent eff0ffc commit 79e1007

1 file changed

Lines changed: 42 additions & 0 deletions

File tree

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import numpy as np
2+
3+
from pyeyesweb.data_models.sliding_window import SlidingWindow
4+
5+
6+
class Rarity:
7+
8+
def __call__(self, sliding_window: SlidingWindow, alpha: float = 0.5) -> float:
9+
if not sliding_window.is_full():
10+
return np.nan
11+
12+
samples, _ = sliding_window.to_array()
13+
n_samples = len(samples)
14+
15+
# Number of bins
16+
n_bins = int(np.sqrt(n_samples))
17+
n_bins = max(n_bins, 1)
18+
print(f"Using {n_bins} for {n_samples} samples.")
19+
20+
# Histogram
21+
counts, bin_edges = np.histogram(samples, bins=n_bins)
22+
23+
# Convert to probability distribution
24+
probabilities = counts / n_samples
25+
26+
# Most probable bin
27+
most_probable_bin_index = np.argmax(probabilities)
28+
most_probable_p = probabilities[most_probable_bin_index]
29+
30+
# Current sample bin
31+
last_sample = samples[-1]
32+
last_sample_bin_index = np.searchsorted(bin_edges, last_sample, side='right') - 1
33+
last_sample_bin_index = np.clip(last_sample_bin_index, 0, n_bins - 1)
34+
last_sample_p = probabilities[last_sample_bin_index]
35+
36+
# Compute rarity using probabilities
37+
d1 = abs(most_probable_bin_index - last_sample_bin_index) # distance in bin space
38+
d2 = most_probable_p - last_sample_p # probability difference
39+
40+
rarity = d1 * d2 * alpha
41+
return float(rarity)
42+

0 commit comments

Comments
 (0)