Нормализованная взаимная информация в тензорном потоке - PullRequest
0 голосов
/ 11 октября 2018

Возможно ли реализовать нормализованную взаимную информацию в Tensorflow?Мне было интересно, смогу ли я сделать это и смогу ли я это дифференцировать.Допустим, у меня есть предсказания P и метки Y в двух разных тензорах.Есть ли простой способ использовать нормализованную взаимную информацию?

Я хочу сделать что-то похожее на это:

https://course.ccs.neu.edu/cs6140sp15/7_locality_cluster/Assignment-6/NMI.pdf

1 Ответ

0 голосов
/ 15 октября 2018

Предположим, что ваш метод кластеризации дает предсказания вероятности / функции принадлежности p(c|x), например, p(c=1|x) - это вероятность x в первом кластере.Предположим, что y является меткой класса истинной земли для x.

. Нормализованная взаимная информация равна enter image description here.

. Энтропия H (Y) может быть оценена следующим образомэта нить: https://stats.stackexchange.com/questions/338719/calculating-clusters-entropy-python

По определению энтропия H (C) равна enter image description here, где enter image description here.

.условная взаимная информация enter image description here, где enter image description here и enter image description here.

Все члены, включающие интеграл, могут быть оценены с использованием выборки,то есть среднее значение по обучающим образцам.Общий НМИ дифференцируем.

Я не правильно понял ваш вопрос.Я предполагал, что вы использовали модель нейронной сети, которая выводит логиты, поскольку вы не предоставили никакой информации.Затем вам нужно нормализовать логиты, чтобы получить p(c|x).

Могут быть и другие способы оценки NMI, но если вы дискретизируете выходные данные любой используемой вами модели, вы не сможете их дифференцировать.


Код TensorFlow

Предположим, у нас есть матрица меток p_y_on_x и предсказания кластеров p_c_on_x.Каждый ряд из них соответствует наблюдению x;каждый столбец соответствует вероятности x в каждом классе и кластере (поэтому каждая строка суммирует до одного).Далее предположим, что равномерная вероятность для p(x) и p(x|y).

Тогда NMI может быть оценена следующим образом:

p_y = tf.reduce_sum(p_y_on_x, axis=0, keepdim=True) / num_x  # 1-by-num_y
h_y = -tf.reduce_sum(p_y * tf.math.log(p_y))
p_c = tf.reduce_sum(p_c_on_x, axis=0) / num_x  # 1-by-num_c
h_c = -tf.reduce_sum(p_c * tf.math.log(p_c))
p_x_on_y = p_y_on_x / num_x / p_y  # num_x-by-num_y
p_c_on_y = tf.matmul(p_c_on_x, p_x_on_y, transpose_a=True)  # num_c-by-num_y
h_c_on_y = -tf.reduce_sum(tf.reduce_sum(p_c_on_y * tf.math.log(p_c_on_y), axis=0) * p_y)
i_y_c = h_c - h_c_on_y
nmi = 2 * i_y_c / (h_y + h_c)

На практике, пожалуйста, будьте очень осторожны с вероятностями, так как они должныбудьте уверены, чтобы избежать числового переполнения в tf.math.log.

Пожалуйста, прокомментируйте, если обнаружите какие-либо ошибки.

...