2017-10-20 7 views
2

テンソルフローで正規化Gini Coefficientを計算しようとしていますが、そうすることができません。私はnumpyで実行された以下のPythonコードを持っていますが、私はtensorflowを使ってそれを実装したいと思います。アイデアがあれば、助けてください。 tensorflowバージョン(ここでテンソルでの正規化ジニ係数の計算方法

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

tf.nn.top_kの代わりに使用しています: Iは、テンソルの形状(1 ,?)と実際のテンソルの形状(1 ,?)

のPythonコードでpredを有するであろうソート用の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) 
関連する問題