一种简单的基尼指数计算方法
训练数据:remainData
[[Rid, Student, Age, BuysComputer],
[1, No, Senior, Yes],
[2, No, MiddleAged, Yes],
[3, Yes, MiddleAged, Yes],
[4, No, Senior, No],
[5, Yes, Senior, Yes]]
目标:计算属性Student的基尼指数值:
第一步:获取属性Student在训练数据中值划分即取值{Yes,No}
第二步:统计Student属性每个取值在训练数据中出现的次数StudentYes = 2, StudentNo= 3
计算每个取值占比:
posProbably = 1.0 * StudentYes /(remainData.length - 1);
negProbably = 1 - StudentYes;
第三步:保存属性的值划分时的最小的基尼指数
1. 当Student=No时候:
(1)正例:BuysComputerYes=2,
反例:BuysComputerNo=1;
正例占比:a=2/(1+2)= 2/3 ;
负例占比:b=1/(1+2)=1/3
基尼指数:giniNo =1- a*a – b*b
(2)Student=Yes时候
正例:BuysComputerYes=2,
反例:BuysComputerNo=0;
正例占比:a=2/(2+0)= 1 ;
负例占比:b=0/(0+2)=0
基尼指数:giniYes =1- a*a – b*b
tenpGini += posProbably* giniNo;
tempGini+= negProbably* giniYes;
tempGiniNo=tempGini;
2. 当Student=Yes时候:
(1)Student=Yes时候
正例:BuysComputerYes=2,
反例:BuysComputerNo=0;
正例占比:a=2/(2+0)= 1 ;
负例占比:b=0/(0+2)=0
基尼指数:giniYes =1- a*a – b*b
(2)当Student=No时候:
正例:BuysComputerYes=2,
反例:BuysComputerNo=1;
正例占比:a=2/(1+2)= 2/3 ;
负例占比:b=1/(1+2)=1/3
基尼指数:giniNo =1- a*a – b*b
tenpGini += posProbably* giniNo;
tempGini+= negProbably* giniYes;
tempGiniYes=tempGini;
说明:计算tempGiniNo ,tempGiniYes时,两者其实是一样的,只是乘以posProbably和negProbably顺序进行了调换,主要是为了保证每种取值都能作为正例和反例进行计算一次。
第四步:GiniStudent={tempGiniNo ,tempGiniYes}。
参考:http://blog.csdn.net/androidlushangderen/article/details/42558235