У меня есть строка, которая может состоять из 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
только немного более разнообразный, чем первый (я бы назвал его низким).