2

我正在尝试在 tensorflow 中计算归一化基尼系数,但我无法这样做。我在 numpy 中执行了相同的以下 python 代码,但我想使用 tensorflow 来实现它。如果有任何想法,请帮助。 我将实际使用张量形状 (1,?) 并预测张量形状 (1,?)

蟒蛇代码:

def gini(actual, pred, cmpcol = 0, sortcol = 1):
     assert( len(actual) == len(pred) )
     all = np.asarray(np.c_[ actual, pred, np.arange(len(actual)) ], dtype=np.float)
     all = all[ np.lexsort((all[:,2], -1*all[:,1])) ]
     totalLosses = all[:,0].sum()
     giniSum = all[:,0].cumsum().sum() / totalLosses

     giniSum -= (len(actual) + 1) / 2.
     return giniSum / len(actual)

 def gini_normalized(a, p):
     return gini(a, p) / gini(a, a)
4

2 回答 2

0

这是一个有效的解决方案。

def gini(actual, pred):
    n = tf.shape(actual)[1]
    indices = tf.reverse(tf.nn.top_k(pred, k=n)[1], axis=[1])[0]
    a_s = tf.gather(tf.transpose(actual), tf.transpose(indices))
    a_c = tf.cumsum(a_s)
    giniSum = tf.reduce_sum(a_c) / tf.reduce_sum(a_s)
    giniSum = tf.subtract(giniSum, tf.divide(tf.to_float(n + 1), tf.constant(2.)))
    return giniSum / tf.to_float(n)

def gini_normalized(a, p):
    return gini(a, p) / gini(a, a)
于 2017-11-15T19:09:33.823 回答
0

这是一个张量流版本(使用tf.nn.top_k而不是np.lexsort排序)。

def gini_tf(actual, pred):
  assert (len(actual) == len(pred))
  n = int(actual.get_shape()[-1])
  indices = tf.reverse(tf.nn.top_k(pred, k=n)[1], axis=0)
  a_s = tf.gather(actual, indices)
  a_c = tf.cumsum(a_s)
  giniSum = tf.reduce_sum(a_c) / tf.reduce_sum(a_s)
  giniSum -= (n + 1) / 2.
  return giniSum / n

gini_normalized没有改变。顺便说一句,看起来你的版本忽略cmpcolsortcol争论。

于 2017-10-31T16:42:44.573 回答