我如何在tensorflow中计算列表的中位数值?
例如:
node = tf.median(X)
X是占位符
在numpy中,我可以直接使用np.median来获取中位数。我该如何在tensorflow中使用numpy操作?
X是占位符
在TensorFlow中,您可以使用tf.numpy_function函数将numpy操作嵌入到TensorFlow图中,以便在TensorFlow中使用它们。
我如何在tensorflow中计算列表的中位数值?
例如:
node = tf.median(X)
X是占位符
在numpy中,我可以直接使用np.median来获取中位数。我该如何在tensorflow中使用numpy操作?
X是占位符
在TensorFlow中,您可以使用tf.numpy_function函数将numpy操作嵌入到TensorFlow图中,以便在TensorFlow中使用它们。
要使用 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')
。编辑:此答案已过时,请使用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]
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])
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)
的速度一样快,且返回一个实际元素。
tf.shape(v)
,我不确定它是否与 top_k 结合使用。另一种方法是制作两个使用相同权重的网络(使用变量作用域,并为第二个网络设置 reuse=True)。使用 [10, 5] 占位符制作第一个网络和 [1, 5] 占位符制作第二个网络。 - BlueSunv = [1, 2, 3]
,这将给出3
。因此,您应该将m
加 1:m = v.get_shape()[0]//2 + 1
。但是,对于具有偶数个值的集合,仍然是错误的。对于v = [1, 2, 3, 4]
,中位数通常应该是两个中间元素的平均值:2.5
。这在 Lucas 的答案的第二部分中得到了正确处理。 - dexteritas