2017-10-20 154 views
2

我想要计算张量流中的归一化Gini Coefficient,但无法这样做。我有下面的Python代码在numpy中执行相同,但我想要使用tensorflow来实现它。如果有任何想法,请帮助。 我将其与张力的形状(1 ,?)实际与张量形状(1 ,?)如何计算张量流中的归一化基尼系数

Python代码预解码:

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) 

回答

0

这里有一个tensorflow版本(采用替代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的论点。

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)