Tensorflow парная пользовательская потеря для взаимной информации - PullRequest
0 голосов
/ 23 октября 2018

Я учусь использовать тензор потока и столкнулся с проблемой при реализации пользовательской функции потерь.В частности, я пытаюсь вычислить среднюю взаимную информацию между всеми парами переменных (идея состоит в том, чтобы определить, какие предсказания для одного класса тесно связаны с другим).

Например, если у меня есть массив

# 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

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

1 Ответ

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

Если вы хотите вычислить взаимную информацию между, скажем, X и Y, это зависит от базовых предположений, которые вы можете сделать.Если у вас очень объемные данные и сложные распределения, я предлагаю биннинг, который не является параметрическим.Также есть несколько более сложных методов, которые я использую.См. здесь , здесь и здесь .

Первые два не очень хорошо масштабируются, а последний включает некоторую настройку гиперпараметра, которая можетполучить ваши цифры полностью (или я делаю что-то неправильно), но масштабируется относительно хорошо.

...