【问题标题】:How to get median of column positive elements in a tensor/matrix?如何获得张量/矩阵中列正元素的中位数?
【发布时间】:2018-09-24 07:52:05
【问题描述】:

具体给定一个二维矩阵,如何求每列正元素的中位数?

从数学上讲:返回 B,其中B[i] = median({A[j, i] | A[j, i] > 0})

我知道中位数可以由tf.contrib.distributions.percentile计算得出

tf.boolean_mask(A, tf.greater(A, 0)) 输出一维列表而不是矩阵。

【问题讨论】:

    标签: python tensorflow conditional-statements distribution median


    【解决方案1】:

    由于我不知道稀疏矩阵的任何中值函数,因此想到的唯一替代方法是遍历列,例如使用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]
    

    注意:这个 sn-p 不包括列不包含正元素的情况。如果输入张量为空,tf.contrib.distributions.percentile() 将返回错误。例如,可以使用tf.boolean_mask(x, tf.greater(x, 0)) 形状的条件(例如使用tf.where()

    【讨论】:

      【解决方案2】:

      您可以像这样遍历列切片并进行过滤。

      inputlist = [[5 , -10 ] ,
                 [10 , 3 ] ,
                 [15 , -5 ]]
      
      x = tf.Variable(initial_value=inputlist)
      
      sess = tf.Session()
      sess.run(tf.global_variables_initializer())
      
      for i in range(x.get_shape().as_list()[1]) : #loop over columns
          print( sess.run(tf.contrib.distributions.percentile(tf.gather(x[:,i],
                                                                           tf.where(tf.greater(x[:,i],
                                                                                               0))),
                                                              50.0)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-16
        • 1970-01-01
        • 1970-01-01
        • 2018-02-05
        • 2019-04-21
        • 1970-01-01
        • 2018-10-20
        相关资源
        最近更新 更多