计算数据集D的经验熵,参考公式5.7 经验熵的计算 :param trainLabelArr:当前数据集的标签集 :return: 经验熵
(trainLabelArr)
| 66 | return classSort[0][0] |
| 67 | |
| 68 | def calc_H_D(trainLabelArr): |
| 69 | ''' |
| 70 | 计算数据集D的经验熵,参考公式5.7 经验熵的计算 |
| 71 | :param trainLabelArr:当前数据集的标签集 |
| 72 | :return: 经验熵 |
| 73 | ''' |
| 74 | #初始化为0 |
| 75 | H_D = 0 |
| 76 | #将当前所有标签放入集合中,这样只要有的标签都会在集合中出现,且出现一次。 |
| 77 | #遍历该集合就可以遍历所有出现过的标记并计算其Ck |
| 78 | #这么做有一个很重要的原因:首先假设一个背景,当前标签集中有一些标记已经没有了,比如说标签集中 |
| 79 | #没有0(这是很正常的,说明当前分支不存在这个标签)。 式5.7中有一项Ck,那按照式中的针对不同标签k |
| 80 | #计算Cl和D并求和时,由于没有0,那么C0=0,此时C0/D0=0,log2(C0/D0) = log2(0),事实上0并不在log的 |
| 81 | #定义区间内,出现了问题 |
| 82 | #所以使用集合的方式先知道当前标签中都出现了那些标签,随后对每个标签进行计算,如果没出现的标签那一项就 |
| 83 | #不在经验熵中出现(未参与,对经验熵无影响),保证log的计算能一直有定义 |
| 84 | trainLabelSet = set([label for label in trainLabelArr]) |
| 85 | #遍历每一个出现过的标签 |
| 86 | for i in trainLabelSet: |
| 87 | #计算|Ck|/|D| |
| 88 | #trainLabelArr == i:当前标签集中为该标签的的位置 |
| 89 | #例如a = [1, 0, 0, 1], c = (a == 1): c == [True, false, false, True] |
| 90 | #trainLabelArr[trainLabelArr == i]:获得为指定标签的样本 |
| 91 | #trainLabelArr[trainLabelArr == i].size:获得为指定标签的样本的大小,即标签为i的样本 |
| 92 | #数量,就是|Ck| |
| 93 | #trainLabelArr.size:整个标签集的数量(也就是样本集的数量),即|D| |
| 94 | p = trainLabelArr[trainLabelArr == i].size / trainLabelArr.size |
| 95 | #对经验熵的每一项累加求和 |
| 96 | H_D += -1 * p * np.log2(p) |
| 97 | |
| 98 | #返回经验熵 |
| 99 | return H_D |
| 100 | |
| 101 | def calcH_D_A(trainDataArr_DevFeature, trainLabelArr): |
| 102 | ''' |
no outgoing calls
no test coverage detected