Weighted Gini coefficient in Python

Here's a simple implementation of the Gini coefficient in Python, stack overflow

def gini(x): # Mean absolute difference. mad = np.abs(np.subtract.outer(x, x)).mean() # Relative mean absolute difference rmad = mad / np.mean(x) # Gini coefficient is half the relative mean absolute difference. return 0.5 * rmad 

How can this be configured to take an array of weights as a second vector? This should take inappropriate weights, so don't just blow up the array by weight.

Example:

 gini([1, 2, 3]) # No weight: 0.22. gini([1, 1, 1, 2, 2, 3]) # Manually weighted: 0.23. gini([1, 2, 3], weight=[3, 2, 1]) # Should also give 0.23. 
0
source share
1 answer

mad calculation can be replaced by:

 x = np.array([1, 2, 3, 6]) c = np.array([2, 3, 1, 2]) count = np.multiply.outer(c, c) mad = np.abs(np.subtract.outer(x, x) * count).sum() / count.sum() 

np.mean(x) can be replaced by:

 np.average(x, weights=c) 

Here is the full function:

 def gini(x, weights=None): if weights is None: weights = np.ones_like(x) count = np.multiply.outer(weights, weights) mad = np.abs(np.subtract.outer(x, x) * count).sum() / count.sum() rmad = mad / np.average(x, weights=weights) return 0.5 * rmad 

to check the result, gini2() use numpy.repeat() to repeat the elements:

 def gini2(x, weights=None): if weights is None: weights = np.ones(x.shape[0], dtype=int) x = np.repeat(x, weights) mad = np.abs(np.subtract.outer(x, x)).mean() rmad = mad / np.mean(x) return 0.5 * rmad 
+2
source

Source: https://habr.com/ru/post/1275589/


All Articles