计算信息增益最大的特征 :param trainDataList: 当前数据集 :param trainLabelList: 当前标签集 :return: 信息增益最大的特征及最大信息增益值
(trainDataList, trainLabelList)
| 121 | return H_D_A |
| 122 | |
| 123 | def calcBestFeature(trainDataList, trainLabelList): |
| 124 | ''' |
| 125 | 计算信息增益最大的特征 |
| 126 | :param trainDataList: 当前数据集 |
| 127 | :param trainLabelList: 当前标签集 |
| 128 | :return: 信息增益最大的特征及最大信息增益值 |
| 129 | ''' |
| 130 | #将数据集和标签集转换为数组形式 |
| 131 | trainDataArr = np.array(trainDataList) |
| 132 | trainLabelArr = np.array(trainLabelList) |
| 133 | |
| 134 | #获取当前特征数目,也就是数据集的横轴大小 |
| 135 | featureNum = trainDataArr.shape[1] |
| 136 | |
| 137 | #初始化最大信息增益 |
| 138 | maxG_D_A = -1 |
| 139 | #初始化最大信息增益的特征 |
| 140 | maxFeature = -1 |
| 141 | |
| 142 | #“5.2.2 信息增益”中“算法5.1(信息增益的算法)”第一步: |
| 143 | #1.计算数据集D的经验熵H(D) |
| 144 | H_D = calc_H_D(trainLabelArr) |
| 145 | #对每一个特征进行遍历计算 |
| 146 | for feature in range(featureNum): |
| 147 | #2.计算条件经验熵H(D|A) |
| 148 | #由于条件经验熵的计算过程中只涉及到标签以及当前特征,为了提高运算速度(全部样本 |
| 149 | #做成的矩阵运算速度太慢,需要剔除不需要的部分),将数据集矩阵进行切割 |
| 150 | #数据集在初始时刻是一个Arr = 60000*784的矩阵,针对当前要计算的feature,在训练集中切割下 |
| 151 | #Arr[:, feature]这么一条来,因为后续计算中数据集中只用到这个(没明白的跟着算一遍例5.2) |
| 152 | #trainDataArr[:, feature]:在数据集中切割下这么一条 |
| 153 | #trainDataArr[:, feature].flat:将这么一条转换成竖着的列表 |
| 154 | #np.array(trainDataArr[:, feature].flat):再转换成一条竖着的矩阵,大小为60000*1(只是初始是 |
| 155 | #这么大,运行过程中是依据当前数据集大小动态变的) |
| 156 | trainDataArr_DevideByFeature = np.array(trainDataArr[:, feature].flat) |
| 157 | #3.计算信息增益G(D|A) G(D|A) = H(D) - H(D | A) |
| 158 | G_D_A = H_D - calcH_D_A(trainDataArr_DevideByFeature, trainLabelArr) |
| 159 | #不断更新最大的信息增益以及对应的feature |
| 160 | if G_D_A > maxG_D_A: |
| 161 | maxG_D_A = G_D_A |
| 162 | maxFeature = feature |
| 163 | return maxFeature, maxG_D_A |
| 164 | |
| 165 | |
| 166 | def getSubDataArr(trainDataArr, trainLabelArr, A, a): |
no test coverage detected