如何计算聚类的基尼系数

时间:2019-03-24 19:05:21

标签: python machine-learning cluster-analysis gini

我有5000个观测值,这些观测值分为10个类。每个群集具有1000个真实观察值。现实生活中的观察值在每个群集中为1000。但是,运行完聚类算法后,它看起来像这样:

Cluster #, true members, clustered members
0,                 1000,               435
1,                 1000,               234
2,                 1000,               167
3,                 1000,               654
4,                 1000,                 0

换句话说,集群0应该有1000个成员,但是其中只有435个通过我的算法正确地添加到了该集群。 5000和群集中的群集之间的差异被放在错误的群集中。

我想计算基尼系数,并找到以下代码:

def gini_ind(Number, Total):
    return (1-(((Number/Total)**2)+(((Total-Number)/Total)**2)))

在我尝试过的测试中似乎工作正常。但是,我发现的数据集都不像我的。

所以我的问题是如何计算基尼系数?

如果执行以下操作,则将获得每个群集的这些基尼系数:

gini_ind(435,1000) -> 0.49155
gini_ind(234,1000) -> 0.3584
gini_ind(167,1000) -> 0.2782
gini_ind(654,1000) -> 0.4525
gini_ind(0,1000) -> 0

每个簇的基尼系数正确吗?

得到平均基尼系数;只是平均值: (0.49155 + 0.3584 + 0.2782 + 0.4525 + 0)/ 5吗?

1 个答案:

答案 0 :(得分:3)

假设我们有3个类和80个对象。在第1类中有19个对象,在第2类中有21个对象,在第3类中有40个对象(表示为(19,21,40))。

基尼系数为:1- [((19/80)^ 2 +(21/80)^ 2 +(40/80)^ 2] = 0.6247,即costbefore =基尼(19,21,40)= 0.6247

为了确定拆分位置,我们测试了所有可能的拆分。例如,以2.0623进行拆分,结果将拆分为(16,9,0)和(3,12,40):

测试x1 <2.0623后:

costL =Gini(16,9,0) = 0.4608
costR =Gini(3,12,40) = 0.4205

然后我们通过经验分支概率加权分支杂质:

costx1<2.0623 = 25/80 costL + 55/80 costR = 0.4331

对于每个可能的分割,例如x1 <1:

costx1<1 = FractionL Gini(8,4,0) + FractionR Gini(11,17,40) = 12/80 * 0.4444 + 68/80 * 0.5653 = 0.5417

此后,我们选择了成本最低的拆分。这是x1 <2.0623的比例,成本为0.4331。

您可以点击以下链接。... http://dni-institute.in/blogs/gini-index-work-out-example/ http://stats.stackexchange.com/questions/95839/gini-decrease-and-gini-impurity-of-children-nodes