Я учусь использовать тензор потока и столкнулся с проблемой при реализации пользовательской функции потерь.В частности, я пытаюсь вычислить среднюю взаимную информацию между всеми парами переменных (идея состоит в том, чтобы определить, какие предсказания для одного класса тесно связаны с другим).
Например, если у меня есть массив
# In simple case, 2 entries of data showing predictions for non-exclusive
# properties A, B, C, and D in that order.
data = np.array([[0.99, 0.05, 0.85, 0.2], [0.97, 0.57, 0.88, 0.1]])
Я хотел бы получить тензор, показывающий взаимную информацию между A и B, A и C, A и D, B и A и т. Д., Где A - 1-й элемент каждого вектора строки, B является вторым и т. Д. Я также согласился бы просто получить среднее значение попарной взаимной информации для каждой переменной (например, среднее значение MI (A, B), MI (A, C) и MI (A, D))
Я бы сделал это путем вычисления энтропии по строкам каждой пары переменных, а затем вычитая энтропию для каждой переменной отдельно.
В качестве отправной точки я рассмотрел существующиекод для вычисления ковариации двух переменных:
def tf_cov(x):
mean_x = tf.reduce_mean(x, axis=0, keepdims=True)
mx = tf.matmul(tf.transpose(mean_x), mean_x)
vx = tf.matmul(tf.transpose(x), x)/tf.cast(tf.shape(x)[0], tf.float32)
cov_xx = vx - mx
return cov_xx
Это хороший пример того, как получить попарную статистику, но он не дает мне достаточно метрик, которые я хочу.
Я могу тo вычислить энтропию и для одной переменной:
def tf_entropy(prob_a):
# Calculates the entropy along each column
col_entropy = tf.reduce_sum(prob_a * tf.log(prob_a), axis=0)
return col_entropy
Кто-нибудь знает хороший способ вычисления парных энтропий?Я полагаю, это будет очень похоже на матрицу, но вместо суммирования поэлементных произведений я бы вычислил энтропию.Конечно, если вы знаете о существующих функциях тензорного потока, которые уже делают то, что я хочу, это было бы здорово.Я читал о различных функциях, связанных с энтропией, но они никогда не были такими, как я хочу.