Как измерить разнообразие (энтропию) распределения в Python? - PullRequest
1 голос
/ 02 апреля 2019

У меня есть строка, которая может состоять из x различных элементов, и мне нужно измерить, насколько разнообразны эти элементы.

Чтобы рассчитать идеальную энтропию строки (в битах), которая является самой «разнородной» строкой (где каждый из элементов x отличается друг от друга), я использую кодниже:

    import math
    ideal = 'abcefghijk' # x = 10 number of elements, each is different
    probid = [ float(ideal.count(c)) / len(ideal) for c in dict.fromkeys(list(ideal)) ]
    entropy_ideal = - sum([ p * math.log(p) / math.log(2.0) for p in probid ])

Затем я беру строку, которую мне нужно сравнить с этим «идеальным» разнообразием, и вычисляю ее энтропию, а затем делю на идеальную, чтобы найти индекс разнообразия для этого распределения:

    string = 'abccbbbbcc'
    prob = [ float(string.count(c)) / len(string) for c in dict.fromkeys(list(string)) ]
    entropy = - sum([ p * math.log(p) / math.log(2.0) for p in prob ])
    index = entropy/entropy_ideal
    print(index)

Мне нужно разделить этот индекс на «разнообразный» / «не разнообразный», и я обнаружил, что это трудно, учитывая, что значения не всегда одинаковы, в зависимости от длины строки.

Есть ли у вас какие-либо предложения относительно того, как я мог бы изменить код или, возможно, использовать существующий пакет Python, который мог бы делать то, что мне нужно?

ОБНОВЛЕНИЕ

Например, для

string = 'ccca'
ideal = 'abcd'

Я получаю

0.8112781244591328 # entropy of the string
0.4056390622295664 # relation

В то время как для

string = 'caaaav'
ideal = 'abcdef'

Я получаю

1.2516291673878228
0.4841962570206112

Но этоМне кажется, в некотором роде интуитивно понятно, что второй stringтолько немного более разнообразный, чем первый (я бы назвал его низким).

...