TensorFlow中位数

15

我如何在tensorflow中计算列表的中位数值?

例如:

node = tf.median(X)

X是占位符
在numpy中,我可以直接使用np.median来获取中位数。我该如何在tensorflow中使用numpy操作?

X是占位符
在TensorFlow中,您可以使用tf.numpy_function函数将numpy操作嵌入到TensorFlow图中,以便在TensorFlow中使用它们。

3个回答

21

要使用 tensorflow 计算数组的中位数,可以使用percentile函数,因为第50个百分位数就是中位数。

import tensorflow as tf
import tensorflow_probability as tfp
import numpy as np 

np.random.seed(0)   
x = np.random.normal(3.0, .1, 100)

median = tfp.stats.percentile(x, 50.0, interpolation='midpoint')

tf.Session().run(median)
上面的代码等同于np.percentile(x, 50, interpolation='midpoint')

8

编辑:此答案已过时,请使用Lucas Venezian Povoa的解决方案。它更简单更快。

您可以在tensorflow内部使用以下方法计算中位数:

def get_median(v):
    v = tf.reshape(v, [-1])
    mid = v.get_shape()[0]//2 + 1
    return tf.nn.top_k(v, mid).values[-1]

如果X已经是一个向量,你可以跳过重塑步骤。
如果你关心对于偶数长度的向量,中位数值是否为两个中间元素的平均值,那么你应该使用这个方法:
def get_real_median(v):
    v = tf.reshape(v, [-1])
    l = v.get_shape()[0]
    mid = l//2 + 1
    val = tf.nn.top_k(v, mid).values
    if l % 2 == 1:
        return val[-1]
    else:
        return 0.5 * (val[-1] + val[-2])

谢谢您的帮助。我定义的X是一个 [None, 5] 的矩阵,因为输入数据的大小是未知的。我该如何解决这个问题? - Yingchao Xiong
@YingchaoXiong,您想计算整个矩阵的中位数还是沿着其中一个维度计算? - BlueSun
在维度方面,我已经解决了这个问题。新的问题是矩阵的大小或如何定义函数中的m值。占位符的大小为[None, 5]。在训练部分,我将批量大小设置为10([10,5]),而当我进行预测时,大小将为[1,5]。我该如何根据馈送的大小更改m的值?非常感谢!!! - Yingchao Xiong
@YingchaoXiong 您可以尝试使用动态形状:tf.shape(v),我不确定它是否与 top_k 结合使用。另一种方法是制作两个使用相同权重的网络(使用变量作用域,并为第二个网络设置 reuse=True)。使用 [10, 5] 占位符制作第一个网络和 [1, 5] 占位符制作第二个网络。 - BlueSun
1
对于 v = [1, 2, 3],这将给出 3。因此,您应该将 m 加 1:m = v.get_shape()[0]//2 + 1。但是,对于具有偶数个值的集合,仍然是错误的。对于 v = [1, 2, 3, 4],中位数通常应该是两个中间元素的平均值:2.5。这在 Lucas 的答案的第二部分中得到了正确处理。 - dexteritas
@dexteritas 谢谢你指出来,我已经修复了代码。我只对非常大的列表应用中位数,所以我从来没有关心过两个中间元素规则的平均值。 - BlueSun

6
我们可以修改BlueSun的解决方案,使其在GPU上运行速度更快:
def get_median(v):
    v = tf.reshape(v, [-1])
    m = v.get_shape()[0]//2
    return tf.reduce_min(tf.nn.top_k(v, m, sorted=False).values)

在我的经验中,这与使用tf.contrib.distributions.percentile(v, 50.0)的速度一样快,且返回一个实际元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接