Я довольно новичок в этом и не могу сказать, что у меня есть полное понимание теоретических концепций этого. Я пытаюсь вычислить расхождение KL между несколькими списками точек в Python. Я использую http://scikit-learn.org/stable/modules/generated/sklearn.metrics.mutual_info_score.html, чтобы попытаться это сделать. Проблема, с которой я сталкиваюсь, состоит в том, что возвращаемое значение одинаково для любых 2 списков чисел (его 1.3862943611198906). У меня такое ощущение, что я делаю здесь какую-то теоретическую ошибку, но не могу ее обнаружить.
values1 = [1.346112,1.337432,1.246655]
values2 = [1.033836,1.082015,1.117323]
metrics.mutual_info_score(values1,values2)
Это пример того, что я запускаю - просто я получаю одинаковый вывод для любых двух входов. Любой совет / помощь будет принята с благодарностью!
python
clustering
scikit-learn
Нанда
источник
источник
sklearn.metrics.mutual_info_score([1.346112,1.337432,1.246655], [1.033836,1.082015,1.117323])
, я получаю значение1.0986122886681096
.Ответы:
Прежде всего,
sklearn.metrics.mutual_info_score
реализует взаимную информацию для оценки результатов кластеризации, а не чистую дивергенцию Кульбака-Лейблера!Расхождение KL (и любая другая такая мера) ожидает, что входные данные будут иметь сумму 1 . В противном случае они не являются правильными распределениями вероятностей . Если ваши данные не имеют суммы 1, то, скорее всего, использование дивергенции KL обычно некорректно! (В некоторых случаях может быть допустимо иметь сумму менее 1, например, в случае отсутствия данных.)
Также обратите внимание, что обычно используют основание 2 логарифмов. Это дает только постоянный коэффициент масштабирования в разнице, но логарифмы с основанием 2 легче интерпретировать и имеют более интуитивную шкалу (от 0 до 1 вместо 0 до log2 = 0.69314 ..., измеряя информацию в битах вместо nat).
как мы можем ясно видеть, MI-результат sklearn масштабируется с использованием натуральных логарифмов вместо log2. Это неудачный выбор, как объяснено выше.
Расхождение Кульбака-Лейблера, к сожалению, хрупкое. В приведенном выше примере это не является четко определенным:
KL([0,1],[1,0])
вызывает деление на ноль и стремится к бесконечности. Это также асимметрично .источник
scipy.stats.entropy
использовании он нормализует вероятности до единицы. Из документов ( scipy.github.io/devdocs/generated/scipy.stats.entropy.html ): «Эта процедура нормализует pk и qk, если они не суммируются с 1».Функция энтропии Сципи вычислит дивергенцию KL, если подать два вектора p и q, каждый из которых представляет распределение вероятности. Если два вектора не являются PDF-файлами, то сначала нормализуется.
Взаимная информация относится, но не совпадает с KL Divergence.
«Эта взвешенная взаимная информация является формой взвешенной дивергенции KL, которая, как известно, принимает отрицательные значения для некоторых входных данных, и есть примеры, когда взвешенная взаимная информация также принимает отрицательные значения»
источник
Я не уверен с реализацией ScikitLearn, но вот быстрая реализация KL-расхождения в Python:
Выход:
0.775279624079
В некоторых библиотеках может возникнуть конфликт реализации , поэтому обязательно прочитайте их документы перед использованием.
источник
0.775279624079
за ваши входы и возвращение метрики склеарна1.3862943611198906
. Смущен до сих пор! Но, похоже, что включение этих проверок значений в соответствии с qn в скрипт должно сделать :)Этот трюк позволяет избежать условного кода и поэтому может обеспечить лучшую производительность.
источник
Рассмотрим три следующих примера из дистрибутива (ов).
Очевидно, что значения1 и значения2 ближе, поэтому мы ожидаем, что показатель
surprise
или энтропия будет ниже по сравнению со значениями3.Мы видим следующий вывод:
Мы видим, что это имеет смысл, потому что значения между значениями 1 и значениями 3 и значениями 2 и значениями 3 просто более радикальны в изменении, чем значения от 1 до значений 2. Это моя проверка для понимания KL-D и пакетов, которые можно использовать для него.
источник