Реализация Python взаимной информации

У меня возникают некоторые проблемы с внедрением функции взаимной информации, которую предоставляют библиотеки обучения компьютера Python, в частности: sklearn.metrics.mutual_info_score (labels_true, labels_pred, contingency = None)

( http://scikit-learn.org/stable/modules/generated/sklearn.metrics.mutual_info_score.html )

Я пытаюсь реализовать пример, который я нахожу в учебном сайте Стэнфордского НЛП:

пример

Сайт находится здесь: http://nlp.stanford.edu/IR-book/html/htmledition/mutual-information-1.html#mifeatsel2

Проблема в том, что я продолжаю получать разные результаты, не выясняя причины.

Я получаю концепцию взаимной информации и выбора функций, я просто не понимаю, как она реализована в Python. Что я делаю, так это то, что я предоставляю метод взаимной_оценки с двумя массивами на основе примера сайта NLP, но он выводит разные результаты. Другой интересный факт заключается в том, что во всяком случае вы играете и меняете числа на этих массивах, вы, скорее всего, получите тот же результат. Должен ли я использовать другую структуру данных, специфичную для Python, или в чем проблема? Если кто-то успешно использовал эту функцию в прошлом, это очень помогло бы мне, спасибо за ваше время.

One Solution collect form web for “Реализация Python взаимной информации”

Сегодня я столкнулся с той же проблемой. После нескольких испытаний я нашел настоящую причину: вы берете log2, если строго придерживаетесь учебника NLP, но sklearn.metrics.mutual_info_score использует натуральный логарифм (базовое e, число Эйлера). Я не нашел эту деталь в документации sklearn …

Я проверил это:

import numpy as np def computeMI(x, y): sum_mi = 0.0 x_value_list = np.unique(x) y_value_list = np.unique(y) Px = np.array([ len(x[x==xval])/float(len(x)) for xval in x_value_list ]) #P(x) Py = np.array([ len(y[y==yval])/float(len(y)) for yval in y_value_list ]) #P(y) for i in xrange(len(x_value_list)): if Px[i] ==0.: continue sy = y[x == x_value_list[i]] if len(sy)== 0: continue pxy = np.array([len(sy[sy==yval])/float(len(y)) for yval in y_value_list]) #p(x,y) t = pxy[Py>0.]/Py[Py>0.] /Px[i] # log(P(x,y)/( P(x)*P(y)) sum_mi += sum(pxy[t>0]*np.log2( t[t>0]) ) # sum ( P(x,y)* log(P(x,y)/( P(x)*P(y)) ) return sum_mi 

Если вы измените этот np.log2 на np.log , я думаю, он даст вам тот же ответ, что и sklearn. Единственное различие заключается в том, что когда этот метод возвращает 0, sklearn вернет число, очень близкое к 0. (И, конечно, используйте sklearn, если вам не нужна база данных, моя часть кода предназначена только для демонстрации, она дает плохие представление…)

FYI, 1) sklearn.metrics.mutual_info_score берет списки, а также np.array; 2) sklearn.metrics.cluster.entropy также использует log, а не log2

Изменить: что касается «того же результата», я не уверен, что вы на самом деле имеете в виду. В общем, значения в векторах не имеют большого значения, это имеет значение «распределение» значений. Вы заботитесь о P (X = x), P (Y = y) и P (X = x, Y = y), а не о значении x, y.

  • Подавление вывода в libsvm (python)
  • Редактировать тензорный поток inceptionV3 retraining-example.py для нескольких классификаций
  • Тренировка классификатора Наивного Байеса на ngrams
  • Наивный Байес: неравномерный набор данных испытаний
  • Нечеткая группа, группировка похожих слов
  • Проблема реализации Backprop
  • Как исправить MatMul Op имеет тип float64, который не соответствует типу float32 TypeError?
  • Существуют ли какие-либо примеры алгоритмов обнаружения аномалий, реализованных с помощью TensorFlow?
  •  
    Interesting Posts for Van-Lav

    Как удалить самые большие письма из моего gmail с помощью скрипта python?

    Как избежать использования метода AppConfig.ready (), выполняющегося дважды в Django

    Что такое «Фляжки»?

    Как найти корень куба с помощью Python?

    Как мне подобрать кривую синуса для моих данных с помощью pylab и numpy?

    Является ли обтекающая библиотека C ++ cтипами плохой идеей?

    Как установить MySQLdb в Python 2.6 CentOS

    Алгоритм роста территории

    Каков самый pythonic способ повторного использования данных в нескольких вызовах одной и той же функции?

    Как избежать предупреждения gcc в расширении Python C при использовании Py_BEGIN_ALLOW_THREADS

    Меню навигации с использованием шаблонов Django

    Почему я не могу изменить python по умолчанию, как Apple говорит, что я могу?

    Использование идентификатора объекта как хеша для объектов в Python

    Pypi: Могу ли я утверждать, что являюсь новым сторонником неподдерживаемого пакета?

    Как получить карту AppEngine, уменьшить масштаб?

    Python - лучший язык программирования в мире.