Предположим, что ваш метод кластеризации дает предсказания вероятности / функции принадлежности p(c|x)
, например, p(c=1|x)
- это вероятность x
в первом кластере.Предположим, что y является меткой класса истинной земли для x
.
. Нормализованная взаимная информация равна .
. Энтропия H (Y) может быть оценена следующим образомэта нить: https://stats.stackexchange.com/questions/338719/calculating-clusters-entropy-python
По определению энтропия H (C) равна , где .
.условная взаимная информация , где и .
Все члены, включающие интеграл, могут быть оценены с использованием выборки,то есть среднее значение по обучающим образцам.Общий НМИ дифференцируем.
Я не правильно понял ваш вопрос.Я предполагал, что вы использовали модель нейронной сети, которая выводит логиты, поскольку вы не предоставили никакой информации.Затем вам нужно нормализовать логиты, чтобы получить 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
.
Пожалуйста, прокомментируйте, если обнаружите какие-либо ошибки.