/
stattools.py
62 lines (40 loc) · 1.33 KB
/
stattools.py
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
59
60
61
62
#! /usr/bin/env python3
from typing import *
T = TypeVar('T')
from statistics import median
from collections import Counter
from math import log2
from .rangetools import histogram # Alias
def medianabsdev(data: Iterable[float]) -> float:
m = median(data)
return median(abs(x - m) for x in data)
def entropy(data: Iterable[T]) -> float:
counter = Counter(data)
total = sum(counter.values())
return -sum(
p * log2(p)
for p in (curr / total for curr in counter.values())
)
def teststats(truths: Iterable[bool], predictions: Iterable[bool]) -> Tuple[int, int, int, int]:
tp = fp = tn = fn = 0
for truth, prediction in zip(truths, predictions):
if prediction:
if truth:
tp += 1
else:
fp += 1
else:
if truth:
fn += 1
else:
tn += 1
return (tp, fp, tn, fn)
def precision(tp: int, fp: int, tn: int, fn: int) -> float:
return tp / (tp + fp)
def recall(tp: int, fp: int, tn: int, fn: int) -> float:
return tp / (tp + fn)
def f1(tp: int, fp: int, tn: int, fn: int, beta: float = 1) -> float:
b = beta ** 2
return (1 + b) * tp / ((1 + b) * tp + fp + b * fn)
def accuracy(tp: int, fp: int, tn: int, fn: int) -> float:
return (tp + tn) / (tp + fp + tn + fn)