Press "Enter" to skip to content

基尼系数介绍与在推荐系统中的应用

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

 

本文主要介绍一个推荐系统中常用的一个评估指标:基尼系数

 

基尼系数是指国际上通用的、用以衡量一个国家或地区居民收入差距的常用指标。基尼系数介于0-1之间,基尼系数越大,表示不平等程度越高。

 

基尼系数的通用计算方法

 

赫希曼根据洛伦茨曲线提出的判断分配平等程度的指标。设实际收入分配曲线和收入分配绝对平等曲线之间的面积为,实际收入分配曲线右下方的面积为。并以除以的商表示不平等程度。这个数值被称为基尼系数或称洛伦茨系数。如果为零,基尼系数为零,表示收入分配完全平等;如果为零则系数为1,收入分配绝对不平等。收入分配越是趋向平等,洛伦茨曲线的弧度越小,基尼系数也越小,反之,收入分配越是趋向不平等,洛伦茨曲线的弧度越大,那幺基尼系数也越大。另外,可以参看帕累托指数(是指对收入分布不均衡的程度的度量)。

 

国内不少学者对基尼系数的具体计算方法作了探索,提出了十多个不同的计算公式。山西农业大学经贸学院张建华先生提出了一个简便易用的公式:假定一定数量的人口按收入由低到高顺序排队,分为人数相等的组,从第1组到第组人口累计收入占全部人口总收入的比重为,则说明:该公式是利用定积分的定义将对洛伦茨曲线的积分(面积)分成个等高梯形的面积之和得到的。

分布图

基尼系数的定义就是的面积除以半个等腰垂直三角形的面积。即:

 

如果还记得微积分的概念,就应该能理解。其中的面积可以近似的看成是每个小格子的面积。每个小格子都是一个梯形,梯形的面积公式,大家应该都有印象吧!

 

然后下面就有一大堆的公式推导(可左右滑动
):

 

带入到基尼系数的公式里面,就是:

 

上面只是公式的推导,有需要的直接使用最后一个公式就行。当然Python numpy中也有计算曲线下面积的函数:np.trapz,一般通过该函数计算也比较方便。

 

基尼系数在推荐系统中的应用

 

基尼系数主要是用来衡量一项内容分布是否均衡,或者分布区间的走向。在推荐系统中主要是用来做一些评估参考,比如

 

在某路召回中,看召回商品的品类是否均衡

 

在粗排阶段,看送往精排的商品分布是否均衡

 

在精排阶段,看吐出来的商品分布是否均衡

 

在重排阶段,看展示给用户的商品分布是否均衡

 

但是在推荐系统的某些阶段评估过程中,也不能完全看这个指标,因为有些场景可能就希望推荐一些头部商品,所以在使用这个指标的时候需要灵活处理。

 

另外如何使用基尼系数衡量推荐系统的流行度呢?这时候需要搜集一个原始的用户行为的基尼系数值,以及推荐系统后用户点击的基尼系数值。如果,就说明推荐系统让热销更热销,而长尾更冷门….我们就需要调整推荐算法,增加商品的覆盖率,改善商品的推荐分布。基于Python实现Gini系数的展示

 

对应的代码为:

 

import numpy as np 
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] 
# 绘图用
fig, ax = plt.subplots()
# 绘制
def Drawing(xarray, yarray):
# 绘制洛伦兹曲线
    ax.plot(xarray, yarray)
# 绘制均衡直线
    ax.plot(xarray, xarray)
    ax.set_xlabel(u'横坐标')
    ax.set_ylabel(u'纵坐标')
    plt.show()
# 计算基尼系数
def Gini():
# 计算数组累计值,从 0 开始
# 原始数据
    num_list = [1.5, 2, 3.5, 10, 4.2, 2.1, 1.1, 2.2, 3.1, 5.1, 9.5, 9.7, 1.7, 2.3, 3.8, 1.7, 2.3, 5, 4.7, 2.3, 4.3, 12]
# 按照个数累计统计后,分别求总数,得到一个平均分的一列坐标。例如5的话,得到的值是[0,1,2,3,4]/4
# 得到的是洛伦兹曲线上方的均衡直线
    xarray = np.array(range(0, len(num_list)+1)) / np.float(len(num_list))
print("xarray", xarray)
# 计算基尼系数,第一个数字需要从 0 开始;先排序
    num_sort = sorted(np.append(num_list, 0))
print("num_sort", num_sort)
# 累加值计算
    csum_numlist = np.cumsum(num_sort)
print("csum_numlist", csum_numlist)
# 取最后一个,也就是原数组的和
    sum_num = csum_numlist[-1]
# 得到洛伦兹曲线
    yarray = csum_numlist / sum_num
print("yarray", yarray)
# 计算曲线下面积的通用方法
    B = np.trapz(yarray, x=xarray)
# 总面积 0.5
    A = 0.5 - B
    G = A / (A + B)
# 绘制图像
    Drawing(xarray, yarray)
return G
a = Gini()
print ('Gini:', a)

Gini系数

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注