Содержимое информации в Python для набора данных с действительными числами
Этот вопрос дополняет предыдущий вопрос.
Мне нужно вычислить информационное содержимое из двух списков Python. Эти списки содержат реальные цифры. Я понимаю, что могу использовать следующую формулу, где вероятности вычисляются из гистограмм списка.
sum_ij p(x_i,y_j) log_2 (p(x_i,y_j)/(p(x_i)p(y_j)) / - sum_i p(y_i) log_2 p(y_i)
Есть ли встроенный Python API для вычисления информационного контента?
Ответ на предыдущий вопрос предложил использовать information_content()
API от BioPython
, Но эта функция работает только для буквенных символов.
Благодарю.
1 ответ
Для дискретных распределений вы можете использовать вышеупомянутый биопайт или scikit-learn's sklearn.metrics.mutual_info_score
, Однако оба вычисляют взаимную информацию между "символическими" данными, используя приведенную вами формулу (которая предназначена для символических данных). В любом случае вы игнорируете, что значения ваших данных имеют свойственный порядок.
Для непрерывных распределений лучше использовать оценку k-ближайшего соседа Козаченко-Леоненко для энтропии (K & L 1987) и соответствующую оценку Краскова, ..., Grassberger (2004) для взаимной информации. Они обходят промежуточный этап вычисления функции плотности вероятности и оценивают энтропию непосредственно от расстояний точки данных до их k-ближайшего соседа.
Основная идея оценки Козаченко-Леоненко состоит в том, чтобы посмотреть (некоторую функцию) среднее расстояние между соседними точками данных. Интуиция заключается в том, что если это расстояние велико, дисперсия в ваших данных велика, и, следовательно, энтропия велика. На практике вместо того, чтобы брать расстояние до ближайшего соседа, обычно стремятся взять расстояние до ближайшего соседа (где k, как правило, небольшое целое число в диапазоне 5-20), что делает оценку более надежной.
У меня есть реализации для обоих на моем github: https://github.com/paulbrodersen/entropy_estimators