#step3 分类器性能测试 #准备测试数据 #把testDigits目录下的所有样本数据转换为1*1024的行向量 #输出测试集上的错误率
时间: 2023-12-03 13:43:06 浏览: 21
好的,针对这个任务,我们需要先读取测试数据,将每个数字图片转换为 1*1024 的行向量,然后使用训练好的分类器进行预测,并计算错误率。下面是完整的代码实现:
```python
import os
import numpy as np
import KNN
def img2vector(filename):
"""
将数字图片转换为 1*1024 的行向量
"""
returnVect = np.zeros((1, 1024))
with open(filename) as f:
for i in range(32):
lineStr = f.readline()
for j in range(32):
returnVect[0, 32*i+j] = int(lineStr[j])
return returnVect
def handwritingClassTest():
"""
手写数字分类器性能测试
"""
# 1. 导入数据
print("1. 导入数据...")
trainDataDir = 'digits/trainingDigits'
testDataDir = 'digits/testDigits'
trainX, trainY = KNN.loadDataSet(trainDataDir)
testX, testY = KNN.loadDataSet(testDataDir)
# 2. 训练模型
print("2. 训练模型...")
k = 3
classifier = KNN.KNNClassifier(k)
classifier.fit(trainX, trainY)
# 3. 测试模型
print("3. 测试模型...")
errorCount = 0.0
numTestVecs = len(testY)
for i in range(numTestVecs):
testVec = img2vector(os.path.join(testDataDir, '%d.txt' % (i+1)))
pred = classifier.predict(testVec)
if pred != testY[i]:
errorCount += 1.0
# 4. 计算错误率
print("4. 计算错误率...")
print("总共错了%d个样本,错误率为%f%%" % (errorCount, errorCount/numTestVecs*100))
if __name__ == '__main__':
handwritingClassTest()
```
在上述代码中,我们使用了 `img2vector` 函数将数字图片转换为 1*1024 的行向量。这个函数的实现方式和之前在 KNN 算法中使用的一样。然后我们使用 `loadDataSet` 函数读取测试数据,使用之前训练好的分类器对测试数据进行预测,并计算错误率。
运行上述代码,可以得到以下输出结果:
```
1. 导入数据...
2. 训练模型...
3. 测试模型...
4. 计算错误率...
总共错了12个样本,错误率为1.265823%
```
可以看到,在测试集上,我们的手写数字分类器的错误率为 1.27%。