Как получить медиану положительных элементов столбца в тензор / матрицу? - PullRequest
0 голосов
/ 24 сентября 2018

Специально с учетом двумерной матрицы, как найти медиану для положительных элементов каждого столбца?

Математически говоря: вернуть B, где B[i] = median({A[j, i] | A[j, i] > 0})

Я знаю, что медиана может быть вычисленапо tf.contrib.distributions.percentile

tf.boolean_mask(A, tf.greater(A, 0)) выводит одномерный список вместо матрицы.

Ответы [ 2 ]

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

tf.boolean_mask() действительно возвращает 1-D тензор, так как в противном случае результирующий тензор с сохраненными размерами будет разреженным (ср. Столбцы с другим числом положительных элементов).

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

import tensorflow as tf

A = tf.convert_to_tensor([[ 1, 0,  20, 5],
                          [-1, 1,  10, 0],
                          [-2, 1, -10, 2],
                          [ 0, 2,  20, 1]])


positive_median_fn = lambda x: tf.contrib.distributions.percentile(tf.boolean_mask(x, tf.greater(x, 0)), q=50)
A_t = tf.matrix_transpose(A) # tf.map_fn is applied along 1st dim, so we need to transpose A
res = tf.map_fn(fn=positive_median_fn, elems=A_t)

with tf.Session() as sess:
    print(sess.run(res))
# [ 1  1 20  2]

Примечание: этот фрагмент не охватывает случай, когда столбец не содержит положительных элементов.tf.contrib.distributions.percentile() вернет ошибку, если его входной тензор пуст.Например, можно использовать условие в форме tf.boolean_mask(x, tf.greater(x, 0)) (например, с tf.where())

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

Вы можете перебрать срезы столбцов и отфильтровать их следующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...