игрок
соперник
дней назад
A
C
1
A
C
2
AD
10
A
F
100
A
F
101
A
F
102
A< /td>
G
1
B
C
1
B
C
2
B
D
10
< td>B
F
100
Б
Ж
101
Б
Ж
102
B
G
1
B
G
2
B
G
3
B
G
4
< tr>
B
G
5
B
G
6
B
G
7
B
G
8
Во-первых, я хочу найти наиболее распространенного противника. Мое определение «наиболее распространенного» — это не общее количество матчей, а скорее сбалансированное количество матчей.
Если, например, игроки A и B сыграли соответственно 99 и 1 раз( s) против C Я предпочитаю соперника D, где A и B играли оба 49 раз.
Чтобы измерить "сбалансированность" пишу следующую функцию:
Код: Выделить всё
import numpy as np
from collections import Counter
def balanceness(array: np.ndarray):
classes = [(c, cnt) for c, cnt in Counter(array).items()]
m = len(classes)
n = len(array)
H = -sum([(cnt / n) * np.log((cnt / n)) for c, cnt in classes])
return H / np.log(m)
Код: Выделить всё
>> balanceness(array=np.array([0, 0, 0, 1, 1, 1]))
1.0
противник
баланс
n_matches
C
1
4
D1
2
F
1
6
G
0.5032583347756457
9
< /div>
Очевидно, что оппонент F является наиболее распространенным. Однако совпадения A и B с F относительно старые.
Как мне включить фактор новизны в свои вычисления, чтобы найти "самый последний общий оппонент"?
Подробнее здесь: https://stackoverflow.com/questions/788 ... umpy-array