测试正确率 :param trainDataArr:训练集数据集 :param trainLabelArr: 训练集标记 :param testDataArr: 测试集数据集 :param testLabelArr: 测试集标记 :param topK: 选择多少个邻近点参考 :return: 正确率
(trainDataArr, trainLabelArr, testDataArr, testLabelArr, topK)
| 121 | |
| 122 | |
| 123 | def model_test(trainDataArr, trainLabelArr, testDataArr, testLabelArr, topK): |
| 124 | ''' |
| 125 | 测试正确率 |
| 126 | :param trainDataArr:训练集数据集 |
| 127 | :param trainLabelArr: 训练集标记 |
| 128 | :param testDataArr: 测试集数据集 |
| 129 | :param testLabelArr: 测试集标记 |
| 130 | :param topK: 选择多少个邻近点参考 |
| 131 | :return: 正确率 |
| 132 | ''' |
| 133 | print('start test') |
| 134 | #将所有列表转换为矩阵形式,方便运算 |
| 135 | trainDataMat = np.mat(trainDataArr); trainLabelMat = np.mat(trainLabelArr).T |
| 136 | testDataMat = np.mat(testDataArr); testLabelMat = np.mat(testLabelArr).T |
| 137 | |
| 138 | #错误值技术 |
| 139 | errorCnt = 0 |
| 140 | #遍历测试集,对每个测试集样本进行测试 |
| 141 | #由于计算向量与向量之间的时间耗费太大,测试集有6000个样本,所以这里人为改成了 |
| 142 | #测试200个样本点,如果要全跑,将行注释取消,再下一行for注释即可,同时下面的print |
| 143 | #和return也要相应的更换注释行 |
| 144 | # for i in range(len(testDataMat)): |
| 145 | for i in range(200): |
| 146 | # print('test %d:%d'%(i, len(trainDataArr))) |
| 147 | print('test %d:%d' % (i, 200)) |
| 148 | #读取测试集当前测试样本的向量 |
| 149 | x = testDataMat[i] |
| 150 | #获取预测的标记 |
| 151 | y = getClosest(trainDataMat, trainLabelMat, x, topK) |
| 152 | #如果预测标记与实际标记不符,错误值计数加1 |
| 153 | if y != testLabelMat[i]: errorCnt += 1 |
| 154 | |
| 155 | #返回正确率 |
| 156 | # return 1 - (errorCnt / len(testDataMat)) |
| 157 | return 1 - (errorCnt / 200) |
| 158 | |
| 159 | |
| 160 |