计算分类错误率 :param trainDataArr:训练数据集数字 :param trainLabelArr: 训练标签集数组 :param n: 要操作的特征 :param div:划分点 :param rule:正反例标签 :param D:权值分布D :return:预测结果, 分类误差率
(trainDataArr, trainLabelArr, n, div, rule, D)
| 50 | return dataArr, labelArr |
| 51 | |
| 52 | def calc_e_Gx(trainDataArr, trainLabelArr, n, div, rule, D): |
| 53 | ''' |
| 54 | 计算分类错误率 |
| 55 | :param trainDataArr:训练数据集数字 |
| 56 | :param trainLabelArr: 训练标签集数组 |
| 57 | :param n: 要操作的特征 |
| 58 | :param div:划分点 |
| 59 | :param rule:正反例标签 |
| 60 | :param D:权值分布D |
| 61 | :return:预测结果, 分类误差率 |
| 62 | ''' |
| 63 | #初始化分类误差率为0 |
| 64 | e = 0 |
| 65 | #将训练数据矩阵中特征为n的那一列单独剥出来做成数组。因为其他元素我们并不需要, |
| 66 | #直接对庞大的训练集进行操作的话会很慢 |
| 67 | x = trainDataArr[:, n] |
| 68 | #同样将标签也转换成数组格式,x和y的转换只是单纯为了提高运行速度 |
| 69 | #测试过相对直接操作而言性能提升很大 |
| 70 | y = trainLabelArr |
| 71 | predict = [] |
| 72 | |
| 73 | #依据小于和大于的标签依据实际情况会不同,在这里直接进行设置 |
| 74 | if rule == 'LisOne': L = 1; H = -1 |
| 75 | else: L = -1; H = 1 |
| 76 | |
| 77 | #遍历所有样本的特征m |
| 78 | for i in range(trainDataArr.shape[0]): |
| 79 | if x[i] < div: |
| 80 | #如果小于划分点,则预测为L |
| 81 | #如果设置小于div为1,那么L就是1, |
| 82 | #如果设置小于div为-1,L就是-1 |
| 83 | predict.append(L) |
| 84 | #如果预测错误,分类错误率要加上该分错的样本的权值(8.1式) |
| 85 | if y[i] != L: e += D[i] |
| 86 | elif x[i] >= div: |
| 87 | #与上面思想一样 |
| 88 | predict.append(H) |
| 89 | if y[i] != H: e += D[i] |
| 90 | #返回预测结果和分类错误率e |
| 91 | #预测结果其实是为了后面做准备的,在算法8.1第四步式8.4中exp内部有个Gx,要用在那个地方 |
| 92 | #以此来更新新的D |
| 93 | return np.array(predict), e |
| 94 | |
| 95 | def createSigleBoostingTree(trainDataArr, trainLabelArr, D): |
| 96 | ''' |
no outgoing calls
no test coverage detected